您的位置:首页 > 编程语言

一个正整数n被分成若干个不同自然数的和,求组成n的一组自然数的最大乘积

2017-02-03 11:21 417 查看
import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

/**

* Created by dd on 2017/4/11.

* 贪心策略:尽可能地将指定的n(n>4)拆分成从2开始的连续的自然数的和

* 如果最后有剩余的数,将这个剩余的数在优先考虑后面项的情况下平均分给前面的各项。

例:n=10,先拆分为:10=2+3+4+1,最后一项为1,比4小,将其分配给前面的一项,

得到10=2+3+5,所以最大的乘积为2*3*5=30.

n=20,拆分为:20=2+3+4+5+6,刚刚好,最大乘积为2*3*4*5*6=720.

n=26,拆分为:26=2+3+4+5+6+6,因为最后一项为6,不比最后的第二项大,

所以将其平均分给前面的项,优先考虑后面的项,即前面的4项各分到1,第5项,分到2,

最后是26=3+4+5+6+8,所以最大的乘积为3*4*5*6*8=2880.

*/

public class Main {

public static void main(String args[]) {

Scanner scan=new Scanner(System.in);

int n=scan.nextInt();

int sum=0;

int k=n;

int all=1;

List<Integer> list=new ArrayList();

if(n==0||n==1||n==2){

System.out.println(0);

}

else if(n==3){

System.out.println(2);

}

else if(n==4){

System.out.println(3);

}

else{

for(int i=2;i<n;i++){

list.add(i);

sum=sum+i;

all=all*i;

k=k-i;

if(k==0){

System.out.println(all);

break;

}

else if(k<=i+1){

if(k<i){

all=all/i;

all=all*(i+1);

System.out.println(all);

break;

}

else if(k==i){

for(int j=0;j<list.size();j++){

int m=list.get(j).intValue()+1;

list.set(j,m);

}

if(k-list.size()>=1){

list.set((list.size()-1),((k-list.size())+(list.get(list.size()-1))));

int ll=list.size()-1;

all=1;

while(ll>=0){

all=all*list.get(ll);

ll--;

}

System.out.println(all);

break;

}

}

}

}

}

scan.close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐