Multiply Strings
问题描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
问题解决:首先我想到的是用最基本的方法来做,即像人工做算术题一样。比如说25*25,那我们首先计算25*5,将得到的值存储在tmp里面(如果该值大于等于10,则保留其个位数,进位由jw来保存)。res在相应的位置上加上tmp的值(不过tmp在res中的位置由乘数决定,比如说5是个位,那么tmp从res的个位开始存储)。接下来轮到十位上的数值5,步骤与前面一致。最后如果有进位,要将进位作为结果的最高位储存起来。由于存储的格式,我把将字符串颠倒了一下。
class Solution {
public:
string multiply(string num1, string num2) {
int len1=num1.length(),len2=num2.length();
int len=len1+len2+1;
//将字符串颠倒
reverse(num1.begin(),num1.end());
reverse(num2.begin(),num2.end());
char res[len],tmp[len];
for(int i=0;i<len;i++)
{
res[i]='0';
tmp[i]='0';
}
for(int i=0;i<len1;i++)
{
int jw=0,r_jw=0;
for(int j=0;j<len2;j++)
{
tmp[j]=((num1[i]-'0')*(num2[j]-'0')+jw)%10+'0';
int res_temp=(res[j+i]-'0')+(tmp[j]-'0')+r_jw;
res[j+i]=res_temp%10+'0';
jw=((num1[i]-'0')*(num2[j]-'0')+jw)/10;
r_jw=res_temp/10;
}
if(r_jw!=0||jw!=0)
{
res[len2+i]=jw+r_jw+'0';
}
}
string result="";
bool flag=false; //代表还没遇到整数
for(int i=len-1;i>=0;i--)
{
if(res[i]!='0'&&!flag)
{
result+=res[i];
flag=true;
}
else if(flag)
result+=res[i];
}
//reverse(res.begin(),res.end());
if(result=="") result="0";
return result;
}
};
beats 27.49 % of cpp submissions.