P1249 最大乘积

题目链接:P1249

解题思路:

有两行输出,先找出乘积最大的那些数,然后用高精度计算乘积。

要想乘积最大,要尽可能使因数多,并且因数之间的差尽可能小,可以从2开始累加,当sum大于n时,把多出的部分取掉即可。

AC代码:

 

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 int f[10010],a[10010],b[10010],c[10010],la,lb,q;
 6 void mul()  // 高精度乘法
 7 {
 8     int k,q;
 9     k = q = 0;
10     for(int i = 0; i < la; i++)
11         for(int j = 0; j < lb; j++)
12             c[i+j] += a[i]*b[j];
13     for(int i = 0; i < la+lb; i++)
14     {
15         if(c[i] >= 10)
16         {
17             c[i+1] += c[i]/10;
18             c[i] %= 10;
19         }
20     }
21     for(int i = la+lb; i >= 0; i--)
22     {
23         a[i] = c[i];
24         if(a[i] == 0 && q == 0) continue;
25         else {k++; q = 1;}
26     }
27     la = k;
28     memset(c,0,sizeof(c)); // 复位
29     memset(b,0,sizeof(b)); // 复位
30 }
31 int main()
32 {
33     int n,i,sum;
34     cin >> n;
35     i = 2; // 从2开始累加
36     sum = q = 0; // 初始化
37     while(sum < n)
38     {
39         sum += i;
40         f[i] = 1;
41         i++;
42     }
43     if(sum > n) // 将多余的数除掉
44     {
45         if(sum - n == 1) f[2] = f[i-1] = 0,f[i++] = 1; // 此处注意特判差为1
46         else f[sum-n] = 0;
47     }
48     for(int j = 2; j < i; j++) // 输出第一行
49     {
50         if(f[j])
51         {
52             cout << j;
53             if(j != i-1) cout << " ";
54         }
55     }
56     cout << endl;
57     for(int j = 2; j < i; j++) // 找到第一个因数
58         if(f[j] == 1)
59             {a[0] = j;f[j] = 0;break;}
60     la = 1;
61     for(int j = 2; j < i; j++) // 将这些数乘起来
62     {
63         if(f[j])
64         {
65             int t = j,k = 0;
66             while(t) // 将数拆开放入数组
67             {
68                 b[k++] = t%10;
69                 t /= 10;
70             }
71             lb = k;
72             mul();
73         }
74     }
75     for(i = la+lb; i >= 0; i--) // 输出
76     {
77         if(a[i] == 0 && q == 0) continue; // 除去前导零
78         else {cout << a[i]; q = 1;}
79     }
80     return 0;
81 }

 

posted @ 2020-09-08 13:41  不敢说的梦  阅读(430)  评论(0)    收藏  举报