- 时空限制1s / 128MB
题目描述
求两数的积。
输入输出格式
输入格式:
两行,两个数。
输出格式:
积
输入输出样例
说明
每个数字不超过10^2000,需用高精
------------------------------------------------------------------------------------------------
既然有了高精度加减法,那就有高精度乘法
跟我们平时计算的习惯不同,实际操作的时候不用管两个大整数位数的多少,直接选一个大整数的每一位与另一个大整数的每一位分别相乘后进位,不用管谁上谁下
而且结果的位数一定不大于两大整数位数的和
AC代码:
1 #include<stdio.h> 2 #include<string.h> 3 #define maxn 23333 4 struct BigNum{ 5 int s[maxn],len; 6 BigNum(){len=1;memset(s,0,sizeof(s));} 7 }; 8 char ai[maxn],bi[maxn]; 9 BigNum a,b,c; 10 void ride(BigNum*,BigNum*,BigNum*); 11 int main(){ 12 scanf(" %s %s",ai,bi); 13 a.len=strlen(ai); 14 b.len=strlen(bi); 15 for(int i=a.len-1;i>=0;i--) a.s[a.len-i]=ai[i]-48; 16 for(int i=b.len-1;i>=0;i--) b.s[b.len-i]=bi[i]-48; 17 ride(&a,&b,&c); 18 for(int i=c.len;i>0;i--) printf("%d",c.s[i]); 19 return 0; 20 } 21 void ride(BigNum *x,BigNum *y,BigNum *z){ 22 z->len=x->len+y->len; 23 for(int i=1;i<=x->len;i++) 24 for(int j=1;j<=y->len;j++){ 25 z->s[i+j-1]+=x->s[i]*y->s[j]; 26 z->s[i+j]+=z->s[i+j-1]/10; 27 z->s[i+j-1]%=10; 28 } 29 while(z->len>1&&!z->s[z->len]) z->len--; 30 }