题目链接:http://acm.dlut.edu.cn/problem.php?id=1176
题目描述:赤裸的大数乘法
解题思路:
突然想到自己没写过高精度乘法,就回咱们自己OJ上找出了这道题,赤裸的高精度乘法而已,没想到依然觉得不好写,准确说来是我从小到大算乘法的习惯使我产生了错觉:“ 想写大数乘法就得先写一个大数加法出来 ”。喂!我短路了半天才想明白,int 数组里可以存个两位数啊,再进位不就好了。(#`O′) 。。然后又照刘汝佳说的把数组反过来写,果然方便了一些。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char a[300],b[300];
int ra[300],rb[300],cal[300],temp[300],ans[300],la,lb,point;
void dancheng(int a[],int b)
{
int i,j,k,t,c=0;
for(i=0;i<300;i++)
{
t=a[i]*b+c;
c=t/10;
temp[i]=t%10;
}
for(k=250;k>=0;k--)if(temp[k])break;
for(i=point,j=0;j<=k;i++,j++)
{
ans[i]+=temp[j];
}
point++;
}
void cheng(char a[],char b[])
{
int i,j;
for(i=la-1,j=0;i>=0;j++,i--)
ra[j]=a[i]-'0';
for(i=lb-1,j=0;i>=0;j++,i--)
rb[j]=b[i]-'0';
for(i=0;i<lb;i++)
{
memset(temp,0,sizeof(temp));
dancheng(ra,rb[i]);
}
}
int main()
{
int T,i,t,c=0;
cin>>T;
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(ans,0,sizeof(ans));
memset(ra,0,sizeof(ra));
memset(rb,0,sizeof(rb));
point=0;
cin>>a>>b;
if(strlen(a)>strlen(b))
{
la=strlen(a);
lb=strlen(b);
cheng(a,b);
}
else
{
la=strlen(b);
lb=strlen(a);
cheng(b,a);
}
for(i=0;i<250;i++)
{
t=ans[i]+c;
c=t/10;
ans[i]=t%10;
}
for(i=250;i>=0;i--)if(ans[i])break;
if(i==-1)
cout<<0;
else
for(;i>=0;i--)cout<<ans[i];
cout<<endl;
}
return 0;
}
AC截图: