题目链接:UVA 10106
大数乘法模板题,直接上代码。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=256;
char x[N],y[N],ans[N*2];
void multiply()
{
int xx[N]={0},yy[N]={0},zz[N*2]={0};
int lenx=strlen(x)-1;
int leny=strlen(y)-1;
int cnt=0;
while(lenx>=0) //从低位到高位储存x
xx[cnt++]=x[lenx--]-'0';
lenx=cnt-1;
cnt=0;
while(leny>=0) //从地位到高位储存y
yy[cnt++]=y[leny--]-'0';
leny=cnt;
/*printf("xx:");
for(int i=0;i<=lenx;i++)
printf("%d",xx[i]);
printf("\n");
printf("yy:");
for(int i=0;i<leny;i++)
printf("%d",yy[i]);
printf("\n");*/
for(int i=0;i<=lenx;i++)
{
int w=0; //记录进位的值
for(int j=0;j<=leny;j++) //leny为当前yy数组的长度,这样可以防止最后w不为0
{
int res=xx[i]*yy[j]+w; //对应位相乘后再加上进位
zz[i+j]+=res%10; //通过(i+j)寻找对应位非常巧妙
w=res/10+zz[i+j]/10; //更新进位的值
zz[i+j]%=10;
}
}
int len=lenx+leny+2;
while(zz[len]==0&&len>=0) //删去数字的前导0
len--;
if(len<0) //对于积为0的情况特判
{
ans[0]='0';
ans[1]='\0';
return ;
}
/*printf("zz:");
for(int i=0;i<=len;i++)
printf("%d",zz[i]);
printf("\n\n");*/
//将乘积反转使得高位在前,低位在后,然后通过字符串直接输出
ans[len+1]='\0';
int tem=0;
while(len>=0)
ans[tem++]=zz[len--]+'0';
}
int main()
{
while(~scanf("%s%s",x,y))
{
memset(ans,0,sizeof(ans));
multiply();
printf("%s\n",ans);
}
return 0;
}