大数加法详解

NC1 大数加法

这是牛客的题。
先说一下思路

这是函数名及其参数

string solve(string s, string t)

1、首先
我先把两个传进来的字符串颠倒一下(reverse)

reverse(s.begin(),s.end());
reverse(t.begin(),t.end());

为什么要颠倒呢

例如有两个字符串
“994”
”9“
如果要遍历字符串的话,两个字符串第一个遇到的就是9 和9

但是实际情况应该是9和4相加

所以如果颠倒一下,就是”499“和”9“了 ,9和4先相加

2、使连个字符串的长度相等,没有的补0

		if(s.size() < t.size()){
    
    
            int len =t.size() - s.size(); 
            for(int i = 0;i < len;i++)
            s.append("0");
        }
        else if(s.size() >t.size()){
    
    
            int len = s.size() - t.size();
            for(int i = 0;i <len;i++)
            t.append("0");
               
        }

这样的话就不用处理其中一个字符串已经遍历完,但是另一个字符串没有遍历完的情况了。很方便

3、最后
从头处理两个字符串就行了,有进位的把carry置为1
下次两个字符相加的时候再加上carry就行

while(i < s.size()&&j < t.size())
        {
    
    
            int num = (carry + (s[i]-48) + (t[j]-48));//cout<<"num"<<num<<" ";
            if( num> 9)
            {
    
    
                int tmp = num % 10;
                carry = 1;
                str = to_string(tmp) + str;

            }
            else {
    
    
                carry = 0;
                str = to_string(num) + str;
                
            }
            i++;
            j++;
        }
        if(carry == 1) str = "1" + str;

完整代码

class Solution {
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算两个数之和
     * @param s string字符串 表示第一个整数
     * @param t string字符串 表示第二个整数
     * @return string字符串
     */
    string solve(string s, string t) {
    
    
       reverse(s.begin(),s.end());
        reverse(t.begin(),t.end());
        int carry = 0;
        int lens = s.size(),lent = t.size();
        int i = 0, j = 0;
        string str;

        if(s.size() < t.size()){
    
    
            int len =t.size() - s.size(); 
            for(int i = 0;i < len;i++)
            s.append("0");
        }
        else if(s.size() >t.size()){
    
    
            int len = s.size() - t.size();
            for(int i = 0;i <len;i++)
           {
    
    
               t.append("0");
               }
        }

        while(i < s.size()&&j < t.size())
        {
    
    
        
            int num = (carry + (s[i]-48) + (t[j]-48));//cout<<"num"<<num<<" ";
            if( num> 9)
            {
    
    
                int tmp = num % 10;
                carry = 1;
                str = to_string(tmp) + str;

            }
            else {
    
    
                carry = 0;
                str = to_string(num) + str;
                
            }
            i++;
            j++;
        }
        if(carry == 1) str = "1" + str;
        return str;
        
    }
    
};

猜你喜欢

转载自blog.csdn.net/psq1508690245/article/details/118494773