每日一题:字符串相加(C++)

题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

1.num1 和num2 的长度都小于 5100
2.num1 和num2 都只包含数字 0-9
3.num1 和num2 都不包含任何前导零
4.你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式

解题思路

  1. 定义两个指针分别指向两个串的当前需要被执行加法的数字位,对于string,看做数组下标,需要从后向前递减指针数值
  2. 每一轮循环的时候,如果这个数字还没有被加完(也就是一个数字比另一个长的情况)那么就让x是当前对应的数字,如果被加完了,那么就直接为0,x和y的和就是curAdd
  3. 让变量add维护每一轮的进位(curAdd + add)%10并把余数变为字符,续在ans字符串后面
  4. 当i和j都为0,并且进位add=0的时候,说明已经完成整个加法
  5. 将ans整个反转过来就得到所求答案
class Solution {
public:
    string addStrings(string num1, string num2) {
        int i = num1.size() - 1;
        int j = num2.size() - 1;

        int curAdd = 0;     // 不考虑进位的和(小于10的数字)
        int add = 0;        // 进位(在这里不是0就是1)
        int x,y;            // 当前用来做加法的数字
        string result = ""; // 初始化为空字符串

        while(i >= 0 || j >= 0 || add != 0){
            x = i >= 0 ? (num1[i] - '0') : 0;   // num1[i]获得的是字符元素,减去”0“才是数字
            y = j >= 0 ? (num2[j] - '0') : 0;
            

            curAdd = x + y;
            result.push_back('0' + (curAdd + add) % 10);    // 进位后的余数
            add = (curAdd + add) / 10;  // 进位(0 或 1)
            i--;
            j--;
        }
        // 反转字符串
        reverse(result.begin(), result.end());
        return result;
    }
};
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页