解释用于添加两个字符串的C ++代码

时间:2016-10-09 20:21:07

标签: c++ algorithm

我试图解决以下问题,即如何添加两个字符串而不将它们转换为整数。我找到了问题的解决方案,但我不明白。有人会用简单的英语解释一下吗?

这是代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int i=num1.size()-1,j=num2.size()-1,carry=0;
        string res="";
        while(i>=0||j>=0)
        {
            if(i>=0) carry+=num1[i--]-'0';
            if(j>=0) carry+=num2[j--]-'0';
            res=to_string(carry%10)+res;
            carry/=10;
        }
        return carry?"1"+res:res;
    }
};

1 个答案:

答案 0 :(得分:0)

好!勒梅向你解释。数字从0到9。因此,可能的最大总和<= 18。因此,我们需要取一个标志/计数/进位虚拟变量,当我们的总和超过10 时,它将为1(num1 [i] - '0'+ num2 [i] - '0'> = 10)< / strong>即可。 当我们添加两个数字时,我们从最后开始。同样,我们将从头到尾循环,即 while(i> = 0或j&gt; = 0或count)。如果i = 0&amp; / |,则计数在语句中j = 0 sum大于10然后我们需要在字符串的开头添加一个额外的。 从两个字符串添加元素并减少相应的计数器i - ,j--。添加进位0或1.计算新进位,将传递给下一个总和计算。以我们想要的单个数字取模数。将其转换为字符串并附加到res。

我的代码

class Solution {
public:
string addStrings(string num1, string num2) {
  int n1 = num1.size(), i = n1 - 1;
  int n2 = num2.size(), j = n2 - 1;
  int carry = 0;
  string res = "";
  while(i>=0 || j>=0 || carry){
      long sum = 0;
      if(i >= 0){sum += (num1[i] - '0');i--;}
      if(j >= 0){sum += (num2[j] - '0');j--;}
      sum += carry; 
      carry = sum / 10;
      sum = sum % 10;
      res = to_string(sum) + res;
  }
  return res;
 }
};