HDU 1402 A * B Problem Plus 高精乘法(数位压缩)

HDU - 1402
 1 /***********************************************
2 *
3 * HDU - 1402 (高精乘法 - 数位压缩)
4 *
5 * 题意:
6 * 求两个5w位数的乘法
7 *
8 * 思路:
9 * 把9个1位数压缩成1个9位数
10 * 相当于1个5W位数变成了1个6K位数
11 * 复杂度变成了: 6000 * 6000 = 3600W
12 * 杭电提交: 900+MS 低空掠过
13 * 网上的一般都是快速FFT变换,有空学学
14 *
15 ***********************************************/
16
17 #include <algorithm>
18 #include <iostream>
19 #include <string.h>
20 using namespace std;
21
22 #define N 13000
23 #define M 51000
24 #define LLD __int64
25
26 LLD a[N], b[N], ans[N];
27 char ca[M], cb[M];
28
29 int StrToNum(char c[], LLD num[]) //将字符串转成数字
30 {
31 int n = strlen(c), k=0;
32 LLD tp=0, p=1, d=1;
33 for(int i=0, j=n-1; i<n; i++, j--)
34 {
35 tp += (LLD)(c[j] - '0') * d; //注意数字的顺序,合成一个数也是从低位到高位
36 if(p>=9) //把9个1位数压成1个9位数,减少循环
37 {
38 num[k++] = tp;
39 tp = 0;
40 p = d = 1;
41 }else{
42 p++;
43 d*=10;
44 }
45 }
46 num[k++] = tp;
47 // for(i=0; i<k; i++)
48 // printf("%I64d ", num[i]);
49 // printf(" yes\n");
50 return k;
51 }
52
53 int main()
54 {
55 int na, nb, n, t, d=0, i, j;
56 const int width = 9;
57 LLD MOD = (LLD)(1e9); //9位的模数
58 while(scanf("%s%s", ca, cb)!=EOF)
59 {
60 memset(a, 0, sizeof(a));
61 memset(b, 0, sizeof(b));
62 na = StrToNum(ca, a);
63 nb = StrToNum(cb, b);
64 memset(ans, 0, sizeof(ans));
65
66 for(i=0; i<na; i++)
67 {
68 for(j=0; j<nb; j++)
69 {
70 ans[i+j] += a[i]*b[j];
71 }
72 for(j=0; j<nb; j++)
73 {
74 if(ans[i+j]>=MOD)
75 {
76 ans[i+j+1] += ans[i+j] / MOD;
77 ans[i+j] %= MOD;
78 }
79 }
80 }
81
82 n = i + j + 2;
83 while(!ans[n] && n>0) n--;
84 if(n>=0) printf("%I64d", ans[n--]);
85 while(n>=0) printf("%0*I64d", width, ans[n--]);
86 printf("\n");
87 }
88 return 0;
89 }


门卫大叔每两天会换一个

有一个很面善,人很好,就算我们1点多回去,他也不会说我们什么

还有一个。。。实在没话说。。问了我们半天。。又凶又凶又凶。。。

不过话说回来,我们先扰他们清梦先的。。  还是有点说不过去。。

原文地址:https://www.cnblogs.com/Nstd/p/2251889.html