整数分解成不同加数的最大乘积

来源:互联网 发布:涂师傅数据恢复能用吗 编辑:程序博客网 时间:2024/05/22 20:44

题库建设


题目

设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;}
1 0