题目
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
提示:
1 <= num1.length, num2.length <= 104
num1 和num2 都只包含数字 0-9
num1 和num2 都不包含任何前导零
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
大数加法,就是模拟竖式加法。
先把两个字符串分别逆置,然后较短的字符串后面用 0 补齐;
然后开始竖式加法,进位的处理要注意细节,最后一个进位不要漏掉;
加完之后再把答案逆置即为所求。
时间复杂度:
O
(
n
)
O(n)
O(n)
空间复杂度:
O
(
1
)
O(1)
O(1)
C++ 代码
class Solution {
public:
string addStrings(string num1, string num2) {
string ans;
int sum, carry = 0;
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
while (num1.size() < num2.size())
num1.append("0");
while (num1.size() > num2.size())
num2.append("0");
for (int i = 0; i < num1.size(); ++i) {
sum = num1[i] + num2[i] + carry - '0' - '0';
if (sum > 9) {
carry = 1;
sum -= 10;
} else {
carry = 0;
}
ans.push_back('0' + sum);
}
if (carry)
ans.append("1");
reverse(ans.begin(), ans.end());
return ans;
}
};