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 }

浙公网安备 33010602011771号