Given two non-negative numbers num1
and num2
represented as string, return the sum of num1
and num2
.
Note:
- The length of both
num1
andnum2
is < 5100. - Both
num1
andnum2
contains only digits0-9
. - Both
num1
andnum2
does not contain any leading zero. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
思路:数字字符串逐位相加,由于字符串的位数是不确定的,可多可少,所以直接转换成数字是不行的,应该按照位数逐项相加,利用C++的string容器比较方便,首先将所要相加的字串翻转,依次从低位向高位相加,中间需要注意的是进位问题,预留出变量来保存对应位置的进位。代码如下:
class Solution {
public:
string addStrings(string num1, string num2) {
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
int len1=num1.length(), len2=num2.length(),flag=0,i=0;
string result;
while(i<len1||i<len2)
{
int val=0;
if(i<len1)
val+=num1[i]-'0';
if(i<len2)
val+=num2[i]-'0';
result+='0'+(val+flag)%10;
flag=(val+flag)/10;
++i;
}
if(flag)
result+='1';
reverse(result.begin(),result.end());
return result;
}
};
另一种减少循环次数的方法,与该方法基本类似:
string addStrings(string num1, string num2) {
int len1 = num1.size(), len2 = num2.size(), add = 0;
if (len1 < len2) return addStrings(num2, num1);
for (int i = 1; i <= len1 && (add || i <= len2); i++, add /= 10) {
add += num1[len1 - i] - '0' + (i <= len2 ? num2[len2 - i] - '0' : 0);
num1[len1 - i] = add % 10 + '0';
}
return (add ? to_string(add) : "") + num1;
}