1.题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
- num1 和num2 的长度都小于 5100.
- num1 和num2 都只包含数字 0-9.
- num1 和num2 都不包含任何前导零。
- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
C语言函数头:
char * addStrings(char * num1, char * num2){}
来源:力扣(LeetCode) 戳我前往题目
2.题目分析
字符串数字相加的题,可以看成一种算数的竖式相加。
需要注意的有:
- 应该是从字符串末尾开始加。
- 两个字符串的位数不一定相等,所以循环遍历的时候注意这点,如果溢出了该怎么取值。
- 考虑进位。当有进位但是两个字符串为空的时候,要记得要进位。
- 最后得到的字符串一定要调换顺序,因为我们是从末尾开始加的。
这就会发生在循环里写不同的情况,为了简便,可以给两个字符串的数进行赋值,把计算结果和进位放在外面,代码会看起来简洁一点儿。
3.代码实现
char * addStrings(char * num1, char * num2){
int n = strlen(num1)-1;
int m = strlen(num2)-1;
int s = 0;
char* sums = (char*)malloc(sizeof(char) * (fmax(n, m) + 3));
int jin = 0,x,y;
//一定不要少加了jin != 0
while(m >= 0 || n >= 0 || jin != 0){
//先取num1的数,给x赋值,这样子可以避免字符串溢出带来的影响
if (n >= 0) x = num1[n] - '0';
else x = 0;
//给num2的数取出来赋值
if(m >= 0) y = num2[m] - '0';
else y = 0;
int sum = x + y + jin;
sums[s++] = '0' + (sum % 10);
jin = sum / 10;//计算是否有进位
n--;
m--;
}
//最后要把得到的字符串调换顺序
for (int i = 0; 2 * i < s; i++) {
int t = sums[i];
sums[i] = sums[s - i - 1], sums[s - i - 1] = t;
}
sums[s++] = 0;//如果输入都为0,这个可以避免错误
return sums;
}
总结:越是简单的题,越需要仔细。