18.2.28 codevs3115 高精度练习之乘法

题目描述 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 }
View Code

居然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 }
View Code

这就需要改一改了……mul开到了两万之大

注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
原文地址:https://www.cnblogs.com/yalphait/p/8486316.html