一个正整数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();
}
}
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();
}
}
相关文章推荐
- 有一个正整数N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大?
- poj 1032 将一个数分成几个不同的数之和,满足这些数的乘积最大。
- 有一个正整数N可以分解成若干个正整数之和,问如何分解能使这些数的乘积最大?
- 若干个不同的自然和为定值,这些自然数乘积最大为多少?
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- 贪心算法——输入任意一个正整数N,将其分成多个互不相同的整数,和为N,乘积最大
- 将一个正整数拆分成若干个互不相同的正整数且乘积最大(JS)
- java题: 设有n个正整数,将它们联接成一排,组成一个最大的多位整数。例如:N=3时,3个整数13、312、343联成的最大整数为:34331213;
- 程序员面试金典——解题总结: 9.18高难度题 18.12给定一个正整数和负整数组成的N*M矩阵,编写代码找出元素总和最大的子矩阵。
- FOJ 1075假设x是一个正整数,它的值不超过65535(即1<x<=65535),将x分解为若干个素数的乘积。
- n个正整数,联接成一排,组成一个最大(最小)的多位整数 python
- n个正整数,联接成一排,组成一个最小(最大)的多位整数
- 一个正整数N,拆成任意个正整数之和,怎样使这些数的乘积最大
- 数字分解为不同自然数的最大乘积
- 求n个正整数连接成一排,组成一个最大的多位整数
- 把自然数N分解成若干个互不相同的正整数,使乘积最大
- 给定一个正整数和负整数组成的N*N矩阵,编写代码找出元素总和最大的子矩阵。
- 给定一个正整数n,则在n所有的分解式中,求因子乘积最大的一个分解及此乘积。
- 华为机试:从一个数组中选取不同的数(均小于10)组成一个最大的三位数
- poj 1032 Parliament 把自然数N分解成若干个互不相同的正整数,使乘积最大;