!!!题解 | 大数加法 非常妙的解法 包括数字转字符串 常看常新

大数加法

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;
//     }
//     //尾部对齐。
   
// };

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务