题目
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
提示:
- num1 和num2 的长度都小于 5100
- num1 和num2 都只包含数字 0-9
- num1 和num2 都不包含任何前导零
- 不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式
分析与题解
本题我们只需要对两个大整数模拟「竖式加法」的过程。从低到高逐位相加,如果当前位和超过 10,则向高位进一位。
具体实现也不复杂,我们定义两个指针 i
和 j
分别指向num1和num2 的末尾,即最低位,同时定义一个变量add
维护当前是否有进位。
需要考虑add进位,当出现超出两个num的最大位数的进位时,程序才会正常运行
然后从末尾到开头逐位相加即可。对于两个数字位数不同的处理,这里统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.size() - 1;
int j = num2.size() - 1;
string ans ="";
int add = 0;
//考虑下标从0开始的情况,所以size-1
//同时考虑所有位数耗尽,但是还存在进位的情况
while(i>=0 || j>=0 || add != 0){
int x = i>=0?num1[i]-'0':0;
int y = j>=0?num2[j]-'0':0;
int result = x + y + add;
//填入的位数再换成char数据类型
ans.push_back('0' + result % 10);
add = result / 10;
i--;
j--;
}
reverse(ans.begin(),ans.end());
return ans;
}
};