题目:
Given two non-negative integers
num1
andnum2
represented as string, return the sum ofnum1
andnum2
.Note:
The length of bothnum1
andnum2
is < 5100.
Bothnum1
andnum2
contains only digits0-9
.
Bothnum1
andnum2
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
。