!!!题解 | 大数加法 非常妙的解法 包括数字转字符串 常看常新
大数加法
https://www.nowcoder.com/practice/11ae12e8c6fe48f883cad618c2e81475
class Solution {
public:
string solve(string s, string t) {
//若是其中一个为空,返回另一个
if(s.empty())
return t;
if(t.empty())
return s;
//让s为较长的,t为较短的
if(s.length() < t.length())
swap(s, t);
//进位标志
int carry = 0;
//从后往前遍历较长的字符串
for(int i = s.length() - 1; i >= 0; i--){
//转数字加上进位
int temp = s[i] - '0' + carry;
//转较短的字符串相应的从后往前的下标
int j = i - s.length() + t.length();
//如果较短字符串还有
if(j >= 0)
//转数组相加
temp += t[j] - '0';
//取进位
carry = temp / 10;
//去十位
temp = temp % 10;
//修改结果
s[i] = temp + '0';
}
//最后的进位
if(carry == 1)
s = '1' + s;
//如果循环结束后还有进位(如 999 + 1 = 1000),在最前面补 '1',不是s+1哈 顺序不一样
return s;
}
};
/*下面这版是一开始的做法,但是这样很愚蠢哈。
知道是从尾部开始对齐,然后也知道一位一位的相加,但是这样非常的愚蠢,
就是如果要从后往前加,可以直接把它们对齐的那些部分转换为int类型直接相加不就好了吗,
然后剩下的某个子串的内容就转化为字符串从头部开始插入,下面这个做法是个反面教材
*/
// #include <string>
// class Solution {
// public:
// string solve(string s, string t) {
// // write code here
// int sizes=s.size();
// int sizet=t.size();
// int carry=0;
// int sum=0;
// string s1;
// int count=1;
// for(int i=sizes-1,j=sizet-1;i>=0&&j>=0;i--,j--){
// int s1=s[i]-'0';
// int s2=t[j]-'0';
// //sum+=carry;
// // sum=sum*10+(s1+s2)%10;
// // carry=(s1+s2)/10;
// //*********************下面这一版也不对。
// // int cur = s1 + s2 + carry; // 当前位 = 两数相加 + 进位
// // sum = sum * 10 + (cur % 10); // 当前位放入结果
// // carry = cur / 10; // 新的进位
// /*
// 这里逻辑有非常非常巨大的问题。一般来说,将当前循环的加和*10再加上个位数,这个是从前往后计算的。
// 但是这里由于从后往前,所以就完全是牛头不对马嘴。进位应该跟着*
// */
// int cur = s1 + s2; // 当前位 = 两数相加 + 进位
// sum = sum + (cur % 10+carry)*count; // 当前位放入结果
// carry = cur / 10;
// count*=10;
// }
// if(sizes==sizet){
// //string s1;
// if(carry==0)s1= to_string(sum);
// else s1= to_string(sum*10+carry);
// }
// else if(sizes>sizet){
// //string s1;
// if(carry==0)s1= to_string(sum);
// else s1= to_string(sum*10+carry);
// string s2=s.substr(0,sizes-sizet);
// s1.insert(0, s2);
// }
// else{
// //string s1;
// if(carry==0)s1= to_string(sum);
// else s1= to_string(sum*10+carry);
// string s2=t.substr(0,sizet-sizes);
// s1.insert(0, s2);
// }
// return s1;
// }
// //尾部对齐。
// };
