注意数组大小。
/*
* VIJOS-1040 高精度乘法
* mike-w
* 2012-10-21
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXL 10000
#define BASE 10000
#define WIDTH 4
int a[MAXL], b[MAXL], c[MAXL];
char buf[MAXL];
int read(int *s)
{
scanf("%s", buf);
int len=strlen(buf);
int w=1, sum=0, p=MAXL-1;
int i;
for(i=len-1; i>=0; i--)
{
sum+=w*(buf[i]-'0');
w*=10;
if(w==BASE)
{
s[p--]=sum;
sum=0;
w=1;
}
}
if(sum)
s[p--]=sum;
return 0;
}
int disp(int *s)
{
int i;
for(i=0; i<MAXL-1; i++)
if(s[i])
break;
printf("%d", s[i++]);
for(; i<MAXL; i++)
printf("%0*d", WIDTH, s[i]);
return 0;
}
int multi(int *s1, int *s2, int *ans)
{
int i, j, c;
for(i=1, c=0; i<=MAXL; i++)
for(j=1; j<=MAXL; j++)
{
ans[MAXL+1-i-j]+=s1[MAXL-i]*s2[MAXL-j]+c;
c=ans[MAXL+1-i-j]/BASE;
if(c)
ans[MAXL+1-i-j]%=BASE;
}
return 0;
}
int main(void)
{
read(a);
read(b);
multi(a, b, c);
disp(c);
putchar('\n');
return 0;
}