1. 程式人生 > 實用技巧 >P1249 最大乘積

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 }