P1249 最大乘積
阿新 • • 發佈:2020-09-08
題目連結: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 intk,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 }