正整数n分解成若干个个不同的自然数之和,使得乘积最大

要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:

2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。

要使加数乘积最大,那么所有的加数要尽可能接近。所以设n的加数如下:
2+3+…+m+k;m为最大加数,k为剩余的数(k<=m);然后把k分到其他数中,策略就是从m->2的数值一次加一,直至把k消耗完。
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;

int main()
{
    int n;
    cin>>n;
    int  sh,x,sum=0;
    for(x=2;;x++){
        if(sum+x>n)break;
        sum+=x;
    }
    x--;//出去剩余的数的最大加数
    sh=n-sum;//剩余的数
    ll ans=1;
    if(sh==x){//如果剩余的数等于最大加数
        ans*=(x+2);//最大加数加2,因为平分一轮后还剩一个
        sh-=2;
        x--;
    }
    //把剩余的平分完
    while(sh){
        sh--;
        ans*=(x+1);
        x--;
    }
    //处理没有平分到的
    while(x>=2){
        ans*=x;
        x--;
    }
    cout<<ans<<endl;
    getchar();
    getchar();
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值