题目描述 Description
给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。
输入描述 Input Description
读入两个用空格隔开的正整数
输出描述 Output Description
输出A*B的值
样例输入 Sample Input
3 12
样例输出 Sample Output
36
数据范围及提示 Data Size & Hint
两个正整数的位数不超过500位
1 #include <iostream> 2 #include <string.h> 3 #include <math.h> 4 5 using namespace std; 6 7 int main() 8 { 9 char a[600],b[600];//计算a*b 10 cin>>a>>b; 11 //scanf("%s %s",la,lb); 12 int la=strlen(a),lb=strlen(b),l=0; 13 int an[600],bn[600]; 14 if(la>lb) 15 { 16 for(int i=la-1;i>=la-lb;i--) 17 bn[i]=b[i-(la-lb)]-'0'; 18 for(int i=0;i<=la-lb-1;i++) 19 bn[i]=0; 20 for(int i=0;i<=la-1;i++) 21 an[i]=a[i]-'0'; 22 l=la-1; 23 } 24 else if(la<lb) 25 { 26 for(int i=lb-1;i>=lb-la;i--) 27 an[i]=a[i-(lb-la)]-'0'; 28 for(int i=0;i<=lb-la-1;i++) 29 an[i]=0; 30 for(int i=0;i<=lb-1;i++) 31 bn[i]=b[i]-'0'; 32 l=lb-1; 33 } 34 else 35 { 36 for(int i=0;i<=la-1;i++) 37 an[i]=a[i]-'0'; 38 for(int i=0;i<=lb-1;i++) 39 bn[i]=b[i]-'0'; 40 l=la-1; 41 } 42 int a0[600],b0[600]; 43 for(int i=0;i<=l;i++) 44 { 45 a0[i]=an[l-i]; 46 b0[i]=bn[l-i]; 47 } 48 int mul[600]={0}; 49 for(int j=0;j<=l;j++) 50 for(int i=0;i<=l;i++) 51 { 52 mul[i+j]+=a0[i]*b0[j]; 53 if(i+j!=2*l) 54 { 55 while(mul[i+j]>=10) 56 { 57 mul[i+j]-=10; 58 mul[i+j+1]++; 59 } 60 } 61 62 } 63 int flag=0; 64 for(int i=2*l;i>=0;i--) 65 { 66 if(mul[i]!=0) 67 flag=1; 68 if(flag) 69 cout<<mul[i]; 70 } 71 cout<<endl; 72 return 0; 73 }
居然wa了好几次……
最后没耐心了 用的加法模板改的
比较繁
mul其实要尽量开大一些……
我这里没怎么注意
而在vijos1014中数据就有点不同了
1014高精度乘法
描述
高精度乘法
输入:两行,每行表示一个非负整数(不超过10000位)
输出:两数的乘积。
样例1
样例输入1
99
101
样例输出1
9999
限制
各个测试点1s
1 #include <iostream> 2 #include <string.h> 3 #include <math.h> 4 5 using namespace std; 6 char a[10002],b[10002];//计算a*b 7 int an[10002],bn[10002]; 8 int a0[10002],b0[10002]; 9 int mul[20002]={0}; 10 11 int main() 12 { 13 cin>>a>>b; 14 int la=strlen(a),lb=strlen(b),l=0; 15 if(la>lb) 16 { 17 for(int i=la-1;i>=la-lb;i--) 18 bn[i]=b[i-(la-lb)]-'0'; 19 for(int i=0;i<=la-lb-1;i++) 20 bn[i]=0; 21 for(int i=0;i<=la-1;i++) 22 an[i]=a[i]-'0'; 23 l=la-1; 24 } 25 else if(la<lb) 26 { 27 for(int i=lb-1;i>=lb-la;i--) 28 an[i]=a[i-(lb-la)]-'0'; 29 for(int i=0;i<=lb-la-1;i++) 30 an[i]=0; 31 for(int i=0;i<=lb-1;i++) 32 bn[i]=b[i]-'0'; 33 l=lb-1; 34 } 35 else 36 { 37 for(int i=0;i<=la-1;i++) 38 an[i]=a[i]-'0'; 39 for(int i=0;i<=lb-1;i++) 40 bn[i]=b[i]-'0'; 41 l=la-1; 42 } 43 for(int i=0;i<=l;i++) 44 { 45 a0[i]=an[l-i]; 46 b0[i]=bn[l-i]; 47 } 48 for(int j=0;j<=l;j++) 49 for(int i=0;i<=l;i++) 50 { 51 mul[i+j]+=a0[i]*b0[j]; 52 if(i+j!=2*l) 53 { 54 while(mul[i+j]>=10) 55 { 56 mul[i+j]-=10; 57 mul[i+j+1]++; 58 } 59 } 60 61 } 62 int flag=0; 63 for(int i=2*l;i>=0;i--) 64 { 65 if(mul[i]!=0) 66 flag=1; 67 if(flag) 68 cout<<mul[i]; 69 } 70 cout<<endl; 71 return 0; 72 }
这就需要改一改了……mul开到了两万之大