两个超大数相加c语言,实现两个超大整数相加 -- C语言

思路

从后向前处理,逐个相加,记录进位Carrer;注意到头的结束条件是 str -1, 因为字符串的头本身也要处理,结束条件是头前面的一个指针地址;最后如果有更长的一个数字,将其剩下的部分加Carrer,补充到前面。最前面一个处理,C可能为1,我们一般多留一位,如果C为0,那么整个字符串前移一位,结尾提前一位写入'\0'

代码实现

int addBigInt(char * str1, char * str2, char * rst){

if(NULL == str1 || NULL == str2 || NULL == rst){

printf("addBigInt param error\n");

return PARAM_ERR;

}

char * p1 = NULL, *p2 = NULL, * pr = NULL;

char * tail1 = NULL, *tail2 = NULL, *tailr = NULL;

int len1 = strlen(str1);

int len2 = strlen(str2);

int len = len1 > len2 ? len1 : len2;

int a = 0, b = 0, r= 0, c = 0;

len = len + 1; /*最后可能发生进位*/

tail1 = str1 + len1 - 1;

tail2 = str2 + len2 - 1;

pr = rst;

tailr = pr + (len - 1);

*(pr + len) = '\0'; /*结尾*/

/*

* 注意这里要用str-1, 因为字符串的头本身也要处理,

* 结束条件是头前面的一个指针地址

*/

while(tail1 != str1 - 1 && tail2 != str2 - 1){

a = *tail1 - '0';

b = *tail2 - '0';

r = a + b + c;

if(r >= 10){

r = r % 10;

c = 1;

} else {

c = 0;

}

*tailr = '0' + r;

tail1--;

tail2--;

tailr--;

}

while(tail1 != str1 - 1){

a = *tail1 - '0';

r = a + c;

if(r >= 10){

r = r % 10;

c = 1;

} else {

c = 0;

}

*tailr = '0' + r;

tail1--;

tailr--;

}

while(tail2 != str2 - 1){

b = *tail2 - '0';

r = b + c;

if(r >= 10){

r = r % 10;

c = 1;

} else {

c = 0;

}

*tailr = '0' + r;

tail2--;

tailr--;

}

if(0 == c){

memcpy(tailr, tailr + 1, len - 1);

*(rst + len - 1) = '\0'; /*因为字符串迁移了,所以要提前一位写入'\0'标明结束*/

} else if (1 == c){

*tailr = '0' + c;

}

return SUCCESS;

}

void testaddBigInt(void){

char str1[100] = "123456789323";

char str2[100] = "45671254563123";

char str3[100] = "523456789323";

char str4[100] = "99671254563123";

char rst[100] = {'\0'};

printf("\n************ testaddBigInt ************ \n");

addBigInt(str1, str2, rst);

printf("%s + %s = %s\n", str1, str2, rst);

memset(rst, 0x0, 100);

addBigInt(str3, str4, rst);

printf("%s + %s = %s\n", str3, str4, rst);

return;

}

代码编译

gcc main.c str.c -g -o a.exe

调试输出

************ testaddBigInt ************

123456789323 + 45671254563123 = 45794711352446

523456789323 + 99671254563123 = 100194711352446

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值