高精度乘法(A*B problem)
/* A*B problem 高精度 */
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
char a[10005],b[10005];
int numa[10005],numb[10005];
int multi[30005];
int lena,lenb;
cin>>a>>b;
lena=strlen(a);
lenb=strlen(b);
if(lena==1&&a[0]=='0')
{
cout<<"0";
return 0;
}
if(lenb==1&&b[0]=='0')
{
cout<<"0";
return 0;
}
memset(multi,0,sizeof(multi));
for(int i=0;i<=lena-1;i++){ numa[lena-i-1]=a[i]-'0'; }
for(int i=0;i<=lenb-1;i++){ numb[lenb-i-1]=b[i]-'0'; }
for(int i=0;i<=lena-1;i++)
for(int j=0;j<=lenb-1;j++)
{
multi[i+j]+=numa[i]*numb[j];
}
for(int i=0;i<=lena+lenb-1;i++)
{
while(multi[i]>=10)
{
multi[i]-=10;
multi[i+1]++;
}
}
int cnt=lena+lenb-1;
while(multi[--cnt]!=0) break;
for(int i=cnt;i>=0;i--) cout<<multi[i];
return 0;
}
高精度乘法的思路与加法减法一样,也是按照列竖式的方法,简单的找规律后我们便能发现第i位与第j位的乘积应该加在结果的第i+j位(i与j都从0开始计数),注意与加法不同的地方在于,每一个位置不能仅仅用赋值来处理,应该用递增,因为对于一个tot,有多组i,j满足i+j=tot。用这样的思路便可写出能实现功能的代码。
浙公网安备 33010602011771号