永发信息网

超级大的整数加减法,输入时要有正负号。希望能写一下代码。c语言

答案:1  悬赏:40  手机版
解决时间 2021-04-02 01:25
超级大的整数加减法,输入时要有正负号。希望能写一下代码。c语言
最佳答案

#include 
#include 
#include 

const int MAXSIZE = 122;

// 完成以字符串形式的两个大数相加。返回字符串形式的和。
// tatol ← addnum1 + addnum2
char *LargeNumberAdd(char const *addnum1,char const *addnum2, char *total) {
int i,j,k = 0,len,result,carry = 0;
int len1 = strlen(addnum1);
int len2 = strlen(addnum2);
for(i = len1 - 1,j = len2 - 1; i >= 0 && j >= 0; --i,--j) {
result = addnum1[i] - '0' + addnum2[j] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(i >= 0) {
result = addnum1[i--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
while(j >= 0) {
result = addnum2[j--] - '0' + carry;
carry = result/10;
total[k++] = result%10 + '0';
}
if(carry) total[k++] = carry + '0';
total[k] = '';
len = strlen(total);
for(i = 0; i < len/2; ++i) {
k = total[i];
total[i] = total[len - 1 - i];
total[len - 1 - i] = k;
}
return total;
}

// 完成以字符串形式的两个大数相减。返回字符串形式的差。
// difference ← subnum1 - subnum2
char *LargeNumberSub(char *subnum1,char *subnum2, char *difference) {
int i,j,k,result,borrow = 0;
int sign = 0,swap = 0;
int maxl,minl;
char *pta,*ptb;
int len1 = strlen(subnum1);
int len2 = strlen(subnum2);
if(len1 == len2) {//两数位数相等时
for(i = 0; i < len1; ++i) {//从高位开始比较,某位大时,这个数就大,相等时继续比较,某位小时,这个数就小
if(subnum1[i] == subnum2[i]) continue;
else if(subnum1[i] < subnum2[i]) {
swap = 1;
break;
}
else {
swap = 0;
break;
}
}
}
if(len2 > len1 || swap) {//减数大于被减数
pta = (char *)malloc((len2 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len1 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum2);
strcpy(ptb,subnum1);
maxl = len2;
minl = len1;
sign = 1;
}
else {//被减数大于减数
pta = (char *)malloc((len1 + 1)*sizeof(char)); // pta总是指向绝对值更大的数
ptb = (char *)malloc((len2 + 1)*sizeof(char)); // 而ptb指向绝对值更小的数
strcpy(pta,subnum1);
strcpy(ptb,subnum2);
maxl = len1;
minl = len2;
sign = 0;
}
for(i = maxl - 1,j = minl - 1,k = 0; j >= 0; --i,--j) {//从个位开始减
result = pta[i] - ptb[j] - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
while(i >= 0) {
result = pta[i--] - '0' - borrow;
if(result < 0) {
result += 10;
borrow = 1;
}
else borrow = 0;
difference[k++] = result + '0';
}
--k;
while(difference[k] == '0' && k > 0) --k;//去除差数前端冗余的'0'
if(sign) difference[++k] = '-';
difference[++k] = '';
for(i = 0; i < k/2; ++i) {
result = difference[i];
difference[i] = difference[k - 1 - i];
difference[k - 1 - i] = result;
}
free(pta);
free(ptb);
return difference;
}

int main() {
char s[MAXSIZE] = "4561239986547";
char t[MAXSIZE] = "4560658897546";
char result[MAXSIZE + 1];
printf("%s + %s = %s
",s,t,LargeNumberAdd(s,t,result));
printf("%s - %s = %s
",s,t,LargeNumberSub(s,t,result));
printf("%s - %s = %s
",t,s,LargeNumberSub(t,s,result));
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
1.8x等于x加上320
想问一下广增13线具体的发车时间 大概多少点
单选题Don'twait______me.Icangothere
单选题北伐战争的主要对象不包括A.吴佩孚B.段
怎么把照片弄成2兆
线性热膨胀系数与哪些因素有关
乐山离双古有多远
韩语中的卡兹米是什么意思
我的文笔优美吗?
火车票退票怎么退?
您好,想向您请教一下两块FPGA之间该如何传递
化学里M与N分别代表什么,该如何区分它们,例
i'm afraid to go to the forest。I‘m f
你好,龙湖星悦荟大米王国办理会员需要什么证
炖鱼苦了怎么办
推荐资讯
霍骁是什么星座
可乐12瓶一箱,每箱48元,要买3箱可乐,需要
订单不足,工人开工不足怎么处理
一种电视机,现价每台2920元,比原价降低750
快乐生活,快乐工作演讲稿
0.25乘0.125乘64的简便计算方法是
初学排球怎样防止受伤
怎样将stl语言转换成scl语言
想问射龙门游戏每天是有上限的吗?最高是多少
贷款100--1000秒贷,好下款的有什么
情人之间怎么相处才能长久呢?
下列加点词语的解释,错误的一项是( )
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?