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

本文详细介绍了一种解决大数加法问题的算法,通过使用字符串而非整数直接操作,避免了传统整数溢出的问题。该算法适用于两非负整数相加,长度不超过5100位,且不含前导零。文中提供了Python和C++两种语言的实现代码,包括进位处理和结果转换为字符串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

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> 转换成string

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值