给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
这是一种思路,暴力解法,但是好像会超时
class Solution {
public:
string addStrings(string num1, string num2) {
if(num1.empty() || num2.empty()) return !num1.empty() ?num1:num2;
//存最后的返回值
string res;
int i = num1.size() - 1, j = num2.size() - 1, k = 0;
//最后出来的时候一定是num1和num2都走到头,且最后一次也已经被加过
while(i >= 0 || j >= 0 || k>= 0)
{
//将整形减去字符'0'就变成了字符
//如果还没到第一位则继续相加,如果越过第一位则直接返回0
k += (i >= 0)?num1[i--] - '0':0;
k += (i >= 0)?num2[j--] - '0':0;
//k%10可以得到个位的数字
res.push_back((k%10 - '0'));
//k/10可以得到进位
k = k/10;
}
//因为最终结果是从高位到地位存储的,所我们需要将字符串逆序一下
reverse(res.begin(),res.end());
return res;
}
};
下面给出另一种写法
class Solution {
public:
int char2int(char c)
{
return c-'0';
}
string addStrings(string num1, string num2)
{
int l1 = num1.size(),l2 = num2.size();
int len = l1 > l2 ? l1 : l2;
//下面两个while循环是给两数中的较短者,在其前面补0
while(l1 < len){
num1 = '0' + num1;
l1++;
}
while(l2 < len){
num2 = '0' + num2;
l2++;
}
int tmp = 0;
string str = "";
for(int i = len - 1;i >= 0;i--)
{
tmp += (char2int(num1[i]) +char2int(num2[i]));
str = to_string(tmp%10) + str;
tmp /= 10;
}
//是否最高位产生了进位
if(tmp != 0)
str = "1" + str;
return str;
}
};