题目描述
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注意:
num1 和num2 的长度都小于 5100.
num1 和num2 都只包含数字 0-9.
num1 和num2 都不包含任何前导零。
你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
来源:力扣
链接:字符串相加
思路:
- 首先根据字符串 num1 和 num2的长度进行补位, 在长度较短的字符串前插字符’0’直至长度相等, 这一步操作可以方便我们利用for循环从字符串末尾逐位向前相加
- 设置进位 step 初始值为 0, 用 string ret接收每一次结果, 第一步已经通过补齐操作使得num1, num2长度相等, 因此给利用 resize 给 ret 开好空间 ret.resize(num1.size());
即 ret[i] = (num1[i] - ‘0’) + (num2[i] - ‘0’) + step + '0;
若该字符 大于 '9’表示下次相加需要进位, 修改 step 为 1
注意如果不大于字符 ‘9’, 要将step 置为 0(防止之前因为进位将step修改为1, 因此如果不置0, 本来本次相加不需要加1, 但由于上次修改了step为1导致本次相加多加了1) - 最后要注意, 当 ret[0] = (num1[0] - ‘0’) + (num2[0] - ‘0’) + step + '0 的结果大于字符 '9’时, 说明此时需要进位, 但for循环记录本次 ret[0]的结果, 将step置为1之后结束循环, 此时返回 ret就丢失了这个记为值, 因此 for循环结束 再加一次判断
即如果 step == 1的, 给 ret前插字符 ‘1’
代码示例:
class Solution {
public:
string addStrings(string num1, string num2) {
//根据num1和num2的长度进行补位操作
int len1 = num1.size();
int len2 = num2.size();
int count = abs(len1 - len2);
if (len1 > len2)
num2.insert(0, count, '0');
else if (len1 < len2)
num1.insert(0, count, '0');
int len = num1.size();
string ret;//作返回值
ret.resize(len);//开好空间,方便下标访问对应值
int step = 0;//表示进位
for (int i = len - 1; i >= 0; --i)
{
ret[i] = (num1[i] - '0') + (num2[i] - '0') + step + '0';
if (ret[i] > '9')//大于字符'9', 即需要进位
{
ret[i] -= 10;
step = 1;
}
else
step = 0;
}
if (step == 1)
ret.insert(0, 1, '1');
return ret;
}
};