415. Add Strings(python+cpp)(大数加法)

题目:

Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2.

Note:
The length of both num1 and num2 is < 5100.
Both num1 and num2 contains only digits 0-9.
Both num1 and num2 does not contain any leading zero.
You must not use any built-in BigInteger library or convert the inputs to integer directly.

解释:
大数加法,需要用一个数组记录进位情况。
python代码:

class Solution(object):
    def addStrings(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        max_len=max(len(num1),len(num2))
        num1=num1.zfill(max_len)
        num2=num2.zfill(max_len)
        result=[0]*(max_len+1)
        flag=[0]*(max_len+1)
        for i in xrange(max_len-1,-1,-1):
            i_sum=int(num1[i])+int(num2[i])+flag[i+1]  
            temp=i_sum-10
            result[i+1]=i_sum%10
            if temp>=0:
                flag[i]=1
            else:
                flag[i]=0
        if flag[0]!=0:
            result[0]=1
        if result[0]==0:
            result.pop(0)
        result_str=''.join([str(i) for i in result])
        return result_str

c++代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        int max_len=max(num1.size(),num2.size());
        int dif=num1.size()>num2.size()?num1.size()-num2.size():num2.size()-num1.size();
        string tmpzero(dif,'0');
        if (num1.size()>num2.size())
            num2=tmpzero+num2;
        else
            num1=tmpzero+num1;
        vector<string> result(max_len+1,"0");
        vector<int> flag(max_len+1,0);
        for (int i=max_len-1;i>=0;i--)
        {
            int i_sum=num1[i]-'0'+num2[i]-'0'+flag[i+1];
            int tmp=i_sum-10;
            result[i+1]=to_string(i_sum%10);
            if (tmp>=0)
                flag[i]=1;
            else
                flag[i]=0;
        }
        if (flag[0]!=0)
            result[0]="1";
        //删除开头的0
        if (result[0]=="0")
            result.erase(result.begin());
        string finalresult;
        finalresult =accumulate(result.begin(),result.end(),finalresult);
        return finalresult;
    }
};

一种非常简便的大数加法解法:
c++代码:

class Solution {
public:
    string addStrings(string num1, string num2) {
        //一种简便的大数加法写法
        string result="";
        int i=num1.size()-1,j=num2.size()-1,carry=0,tmp=0;
        while(i>=0 || j>=0 ||carry>0)
        {
            tmp=carry;
            if (i>=0)
                tmp+=num1[i--]-'0';
            if(j>=0)
                tmp+=num2[j--]-'0';
            //进位
            carry=tmp/10;
            //本位
            result=to_string(tmp%10)+result;
        }
        return result;
    }
};

python代码:

class Solution:
    def addStrings(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        i,j,tmp,result,carry=len(num1)-1,len(num2)-1,0,"",0;
        while(i>=0 or j>=0 or carry>0):
            tmp=carry
            if i>=0:
                tmp+=int(num1[i])
                i-=1
            if j>=0:
                tmp+=int(num2[j])
                j-=1
            #进位
            carry=tmp//10;
            #本位
            result=str(tmp%10)+result;
        return result 

总结:
可以机智地用accumulate()函数把vector 转换成string

你可能感兴趣的:(LeetCode)