思路
从后向前处理,逐个相加,记录进位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