高精度乘法

高精度乘法就是把 a 的每一位和 b 相乘。

 

关键的一件事就是别把积 c 数组 的每一位弄错了,比如用 a 的第 i 位 a[i] 乘以 b[j] ,那么对应的 c 的位数就是 c[i + j] (i,j都是从0开始),列一个竖式就能很直观地看出来了。

 

还有一件事就是 c 数组的位数问题,一个 n 位数的数乘以一个 m 位数的数,的数最多是一个 n + m 位数的数,所以 c 数组要开 2 * maxn

上代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn = 1e3 +5;
 7 char a1[maxn], b1[maxn];
 8 int a[maxn], b[maxn], c[2 * maxn];    //c的最高位最大为 la + lb,所以 maxn * 2 
 9 int main()
10 {
11     gets(a1); gets(b1);
12     int la = strlen(a1), lb = strlen(b1);
13     for(int i  = 0; i < la; ++i) a[i] = a1[la - i - 1] - '0';
14     for(int i  = 0; i < lb; ++i) b[i] = b1[lb - i - 1] - '0';        //读入 
15     for(int i = 0; i < la; ++i)            //用b乘以a的每一位 
16     {
17         for(int j = 0; j < lb; ++j)
18         {
19             c[i + j] += a[i] * b[j];
20             c[i + j + 1] += c[i + j] / 10;        //给下一位进位 
21             c[i + j] %= 10;
22         }
23     }
24     int lc = la + lb;         
25     while(c[lc] == 0 && lc > 0)  lc--;    //删除前导零 
26     for(int i = lc; i >= 0; --i) printf("%d", c[i]);
27     printf("\n");
28     return 0;
29 }

 

还有一个比较丑的带负数的代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<cctype>
 8 #include<vector>
 9 #include<stack>
10 #include<queue>
11 using namespace std;
12 #define enter puts("") 
13 #define space putchar(' ')
14 #define Mem(a, x) memset(a, x, sizeof(a))
15 #define rg register
16 typedef long long ll;
17 typedef double db;
18 const int INF = 0x3f3f3f3f;
19 const db eps = 1e-8;
20 const int maxn = 505;
21 inline ll read()
22 {
23   ll ans = 0;
24   char ch = getchar(), last = ' ';
25   while(!isdigit(ch)) last = ch, ch = getchar();
26   while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
27   if(last == '-') ans = -ans;
28   return ans;
29 }
30 inline void write(ll x)
31 {
32   if(x < 0) x = -x, putchar('-');
33   if(x >= 10) write(x / 10);
34   putchar(x % 10 + '0');
35 }
36 
37 char a1[maxn], b1[maxn];
38 int a[maxn], b[maxn], c[maxn << 1];
39 int flg1 = 0, flg2 = 0;
40 
41 int main()
42 {
43     scanf("%s%s", a1, b1);
44     int la = strlen(a1), lb = strlen(b1);
45     if(a1[0] == '-')
46     {
47         flg1 = 1;
48         for(int i = 1; i < la; ++i) a1[i - 1] = a1[i];
49         la--;
50     }
51     if(b1[0] == '-')
52     {
53         flg2 = 1;
54         for(int i = 1; i < lb; ++i) b1[i - 1] = b1[i];
55         lb--;
56     }    
57     for(int i = 0; i < la; ++i) a[i + 1] = a1[la - i - 1] - '0';
58     for(int i = 0; i < lb; ++i) b[i + 1] = b1[lb - i - 1] - '0';
59     for(int i = 1; i <= la; ++i)
60         for(int j = 1; j <= lb; ++j)
61         {
62             c[i + j] += a[i] * b[j];
63             c[i + j + 1] += c[i + j] / 10;
64             c[i + j] %= 10;
65         }
66     int x = la + lb + 5;
67     while(!c[x] && x > 2) x--;
68     bool flg3 = 1;
69     if(!c[x] && x == 2) flg3 = 0;
70     if(flg1 ^ flg2 && flg3) putchar('-');
71     for(int i = x; i > 1; --i) write(c[i]); enter;
72     return 0;
73 }

 

posted @ 2018-03-07 20:14  mrclr  阅读(1213)  评论(0编辑  收藏  举报