题库建设
题目
设n为一自然数,n可以分解成若干个不同的自然数的和,这样的分法有很多种,比如n=10, 10可以分解为:10=5+4+1; 10=5+3+2; 10+9+1; 10=8+2; 10=7+3; 10=6+4; 10=,7+2+1; 10=6+3+1;…。在所有这些分法中,各加数乘积最大的为30, (10=5+3+2中加数的乘积为5*3*2=30)。试编写程序,求各种分解方法中各加数乘积的最大值。
输入要求:输入只有1行,自然数n。
输出要求:输出也只有1行,所有分解方法中各加数乘积的最大值。
代码
发现一个规律:就是连续的整数乘积是最大的,比如12:
12 = 2+3+4+3=3+4+5=2+4+6
发现3*4*5最大
13 = 2+3+4+4 = 3+4+6最大
可以总结出:从2开始依次求出连续的加数因子,最后将剩下的数平均分到前面的因子里(如果有的话),比如9 = 2+3+4就不用分了,像13这种平均分完之后还剩了1,那肯定加在最大的数了。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n = 0;//待分解的数
cin >> n;
int factor[50] = { 0 };//存放因子的数组
int i = 0;
//从2开始分解出因子
for (int j = 2; j <= n; j++) {
factor[i++] = j;
n -= j;
}
if (0 != n) {
if (n == i + 1) {//即现在的n比因子数还多一个,不可能均匀分配,所以加在最后先
factor[i - 1]++;
n--;
}
for (int j = 0; j < n; j++) {//从后往前依次加1
factor[i - j - 1]++;
}
}
int max = 1;
for (int j = 0; j < i; j++) {
max *= factor[j];
}
cout << max << endl;
return 0;
}