题目描述:给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
注意:
-
num1
和num2
的长度都小于 5100. -
num1
和num2
都只包含数字0-9
. -
num1
和num2
都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
一开始想到的是竖式相加法,从字符串的最后一个开始,建立一个结果字符串,把算得的每一位加入结果,进位保存,当有一个字符串处理完处理另一个剩余的,不过由于细节处理不到位,迭代器不兼容,不知道有没有大佬能看到这篇博客指出问题
class Solution {
public:
int tr(char s)
{
return s - '0';
}
char dtr(int s)
{
return (s + '0');
}
string addStrings(string num1, string num2) {
string res;
string longer = num1.size() >= num2.size() ? num1 : num2;
string shorter = num1.size() >= num2.size() ? num2 : num1;
int j = longer.size() - 1;
int carry = 0;
auto it = res.begin();
for (int i = shorter.size() - 1; i >= 0; i--)
{
int sum = tr(longer[j]) + tr(shorter[i]) + carry;
carry = sum / 10;
sum = sum % 10;
res.insert(it, dtr(sum));
j--;
}
if (j == 0 && carry != 0)res.insert(it, dtr(carry));
if (j != 0)
{
if (carry != 0)
{
while (j >= 0)
{
int sum = tr(longer[j]) + carry;
carry = sum / 10;
sum %= 10;
res.insert(it, dtr(sum));
j--;
}
}
else
{
while (j >= 0)
{
res.insert(it, dtr(longer[j]));
j--;
}
}
}
return res;
}
};
我感觉我逻辑上并没有问题,反正迭代器就是出现不兼容的问题。。
然后看了看评论大佬的方法,很简洁,值得学习,就仿照着写了
class Solution {
public:
string addStrings(string num1, string num2) {
string res;
int carry=0,i=num1.size()-1,j=num2.size()-1;
while(i>=0||j>=0||carry!=0)
{
if(i>=0){carry+=num1[i]-'0';i--;}
if(j>=0){carry+=num2[j]-'0';j--;}
int add=carry%10;
res.insert(res.begin(),char(add+'0'));
carry/=10;
}
return res;
}
};
这种大数用字符串,数组,链表存储的数相加都可以这样解决。