Given two non-negative integers num1
and num2
represented as string, return the sum of num1
and num2
.
Note:
num1
and num2
is < 5100.num1
and num2
contains only digits 0-9
.num1
and num2
does not contain any leading zero.string addStrings(string num1, string num2)
1、终于碰到大数加法的题目了……两个存储在string里面的十进制数,要计算出相加的结果,结果存储在string里面。
2、模拟人类手工做这种题目的做法就ok了。
首先从末尾开始,两个string中的数字相加,进位记录下来,传递给下一次相加。
如果短的string已经处理完了,那么接着带进位去处理剩下的长的string。
最后如果还有进位的话,再处理一次。
代码如下:
string addStrings(string num1, string num2)
{
int num1size=num1.size();
int num2size=num2.size();
int carry=0;//表示进位
int t1;//两位数相加的结果
string res="";
if(num1size<num2size)
{
int j=num2size-1;
for(int i=num1size-1;i>=0;i--,j--)
{
t1=num1[i]-'0'+num2[j]-'0'+carry;//取出的两个字符转化为数字,加上进位
carry=t1/10;
t1=t1%10;
res=to_string(t1)+res;//to_string这个函数真的很方便
}
for(;j>=0;j--)//接着处理长的字符串
{
t1=num2[j]-'0'+carry;
carry=t1/10;
t1=t1%10;
res=to_string(t1)+res;
}
if(carry==1)//最后带进位就在字符串最前面加“1”
res="1"+res;
return res;
}
else
{
int j=num1size-1;
for(int i=num2size-1;i>=0;i--,j--)
{
t1=num2[i]-'0'+num1[j]-'0'+carry;
carry=t1/10;
t1=t1%10;
res=to_string(t1)+res;
}
for(;j>=0;j--)
{
t1=num1[j]-'0'+carry;
carry=t1/10;
t1=t1%10;
res=to_string(t1)+res;
}
if(carry==1)
res="1"+res;
return res;
}
}
上述代码实测18ms,beats 24.67% of cpp submissions。
3、改进:
看到好多人都能刷出12ms的成绩,寻思着怎么改进……
比较浪费时间的也就是to_string函数,还有一些没有必要的中间变量。
我们没有必要使用to_string函数,可以直接把计算出来的数值+'0',就是相应数字的ASCII码。
我们也可以不再定义res字符串,直接修改比较长的那个字符串的值。
代码如下:
string addStrings(string num1, string num2)
{
int num1size=num1.size();
int num2size=num2.size();
int carry=0;//表示进位
int t1;//两位数相加的结果
if(num1size<num2size)
{
int j=num2size-1;
for(int i=num1size-1;i>=0;i--,j--,carry=t1/10)
{
t1=num1[i]-'0'+num2[j]-'0'+carry;
num2[j]=(t1%10)+'0';//省去了一些中间步骤t1=t1%10,'0'字符在计算机中用ASCII码存储
}
for(;j>=0;j--,carry=t1/10)
{
t1=num2[j]-'0'+carry;
num2[j]=t1%10+'0';
}
if(carry==1)
num2="1"+num2;
return num2;
}
else
{
int j=num1size-1;
for(int i=num2size-1;i>=0;i--,j--,carry=t1/10)
{
t1=num2[i]-'0'+num1[j]-'0'+carry;
num1[j]=t1%10+'0';
}
for(;j>=0;j--,carry=t1/10)
{
t1=num1[j]-'0'+carry;
num1[j]=t1%10+'0';
}
if(carry==1)
num1="1"+num1;
return num1;
}
}
省去了字符串res的空间,省去了to_string()函数调用的一些时间,省去了一些中间变量的读取时间(计算时间没有省)。
上述代码实测12ms,beats 83.64% of cpp submissions。