Description
Note
Solution 1(C++)
class Solution {
public:
string addStrings(string num1, string num2) {
int sum = 0, i = num1.length() - 1, j = num2.length() - 1;
string str;
while (i >= 0 || j >= 0 || sum > 0) {
if (i >= 0) sum += (num1[i--] - '0');
if (j >= 0) sum += (num2[j--] - '0');
str.insert(0, 1, (sum % 10) + '0');
sum /= 10;
}
return str;
}
};
Solution 2(C++)
class Solution {
public:
string addStrings(string num1, string num2) {
int i = num1.size() - 1;
int j = num2.size() - 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 = res + to_string(sum);
}
reverse(res.begin(), res.end());
return res;
}
};
Solution 3(C++)
class Solution {
public:
string addStrings(string num1, string num2) {
long numa=StringToInt(num1), numb=StringToInt(num2);
long sum= numa+ numb;
cout<<numa<<"||"<<numb<<endl;
return IntToString(sum);
}
long StringToInt(string &s){
int len=s.size();
long res=0;
for(int i=0; i<len; i++){
res+= (s[i]-48)* pow(10, len-i-1);
}
return res;
}
string IntToString(long &n){
string res;
if(n == 0)
res.push_back('0');
while(n != 0){
int temp= n % 10;
n /= 10;
res.push_back(temp+'0');
}
reverse(res.begin(), res.end());
return res;
}
};
算法分析
经典的大数运算,解法三是我花了大半个下午,然后居然发现s[i]写成了s[1]的坑爹错误,还发现根本没对上别人的出题意图,完全自己在那里瞎做的惨痛教训。
一定一定要搞清楚题目的意思。不要在这里瞎写,所以解法三就放在这里,当作一个惨痛教训。解法三缺点有很多:1、运算范围受限于计算机性能与基本数据类型;2、大大增加了运算复杂度。
解法一与二本质无差别。经典的题目,一定以后在看到要多做几遍。
程序分析
首先,要说一个问题:函数reverse与reserve要区分开,前者可以参考:C++ reverse。
然后就是:双引号”“ 与单引号‘’ 的区别,前者”0“,是一个string。后者’0’是一个字符char。