leetcode-415.字符串相加
数学问题
题目详情
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例1:
输入:num1 = "11", num2 = "123"
输出:"134"
示例2:
输入:num1 = "456", num2 = "77"
输出:"533"
示例3:
输入:num1 = "0", num2 = "0"
输出:"0"
思路:
对于两个整数相加的问题,因为我们加法是从后往前加的,所以我们反转一下字符串
然后让对应位之间相加,并注意处理进位的问题即可
我的代码:
class Solution
{
public:
string addStrings(string num1, string num2)
{
string res("");// 存储结果字符串
// 反转加数
reverse(num1.begin(), num1.end());
reverse(num2.begin(), num2.end());
int len_one = num1.length(), len_two = num2.length();
if (len_one < len_two) // 我们让较长的数字在前,方便处理
{
swap(num1, num2);
swap(len_one, len_two);
}
int addbit = 0; // 进位值
//根据较短数字来逐位相加
for (int i = 0; i < len_two; ++i)
{
int cur_sum = (num1[i]-'0') + (num2[i]-'0') + addbit; // 转化为int相加并加上进位值
res += to_string(cur_sum % 10); // 是否产生进位在下一行处理,这里直接取模
addbit = cur_sum < 10? 0: 1; // 下一位是否进位
}
//这里处理num1比num2长的那一部分,和上面同理
for (int i = len_two; i < len_one; ++i)
{
int cur_sum = (num1[i]-'0') + addbit;
res += to_string(cur_sum % 10);
addbit = cur_sum < 10? 0 : 1;
}
if (addbit) // 处理最高位(反转后的最后一位)
{
res += "1"; //在尾部加"1"(反转后的最高位)
}
reverse(res.begin(), res.end()); // 反转回来
return res;
}
};