LeetCode43-字符串相乘
43. 字符串相乘:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意: 不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
解题思路1:
大数乘法模板题,直接用就行
class Solution {
//大数乘法(要用到大数加法)
string add(string a,string b)
{
string s;
int len1,len2;
len1=a.size()-1;
len2=b.size()-1;
int flag=0;
while(len1>-1&&len2>-1)
{
int sum=flag+(a[len1--]-'0')+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len1>-1)
{
int sum=flag+(a[len1--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
while(len2>-1)
{
int sum=flag+(b[len2--]-'0');
s+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
s+=char('0'+flag);
int len=s.size()-1;
while(len>-1)
{
if(s[len]!='0')
break;
s=s.substr(0,s.size()-1);
len--;
}
for(int i=0;i<s.size()/2;i++)
{
char c=s[i];
s[i]=s[s.size()-i-1];
s[s.size()-i-1]=c;
}
if(s.size()==0)
s+='0';
return s;
}
string mul(string a,string b)//需要用到大数加
{
string s;
int len1=a.size();
int len2=b.size();
for(int i=0;i<len2;++i)
{
int num=b[len2-i-1]-'0';
int len=len1-1;
int flag=0;
string temp="";
while(len>-1)
{
int sum=flag+(a[len--]-'0')*num;
temp+=char ((sum)%10+'0');
flag=sum/10;
}
if(flag)
temp+=char('0'+flag);
len=temp.size();
for(int j=0;j<len/2;j++)
{
char c=temp[j];
temp[j]=temp[len-j-1];
temp[len-j-1]=c;
}
for(int j=0;j<i;++j)
temp+='0';
s=add(s,temp);
}
return s;
}
public:
string multiply(string num1, string num2) {
return mul(num1,num2);
}
};
解题思路2:
自己手动实现了一下,不用大数加法,用ans来表示结果,每次相乘最多为91,也就是两位,低位和高位,把这两位加到对应位置就行。
需要注意一直进位问题就行
class Solution {
public:
string multiply(string num1, string num2) {
int len1=num1.length(),len2=num2.length();
if((len1==1&&num1[0]=='0') || (len2==1&&num2[0]=='0'))
return "0";
if(len1<len2) {
swap(num1,num2);
swap(len1,len2);
}
//cout<<"num1="<<num1<<endl;
//cout<<"num2="<<num2<<endl;
int ans[405]={0};
for(int i=len2-1;i>=0;--i) {
int x=num2[i]-'0';
for(int j=len1-1;j>=0;--j) {
int y=num1[j]-'0';
int sum=x*y; //最多81,加到ans上去
int loc=(len2-i-1)+(len1-j-1); //低位开始位置
ans[loc]+=sum%10;
while(ans[loc]>=10) {
ans[loc]%=10;
ans[loc+1]+=1;
++loc;
}
loc=len2-i+(len1-j-1); //高位开始位置
ans[loc]+=sum/10;
while(ans[loc]>=10) {
ans[loc]%=10;
ans[loc+1]+=1;
++loc;
}
}
}
string ret="";
bool flag=false;
for(int i=402;i>=0;--i) {
if(ans[i]>0)
flag=true;
if(flag) {
char c=ans[i]+'0';
ret+=c;
}
}
return ret;
}
};