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

题库建设


题目

设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;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值