【贪心】最大乘积-贪心-高精度-java

问题 G: 【贪心】最大乘积

时间限制: 1 Sec  内存限制: 128 MB
提交: 34  解决: 10
[提交][状态][讨论版]

题目描述

 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。

现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

输入

只一个正整数n,(3≤n≤10000)。

输出

第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。

第二行是最大的乘积。

样例输入

10

样例输出

2 3 5
30
思路:要求乘积最大,就得让每一个数尽量地接近,从2,开始分,最后剩下的数依次从后面加到前面的数上面(每个数加上1)。例如10,分开后是2,3,4,剩下1,加到最后面的4上成2,3,5.如果是18,依次是2,3,4,5剩下4,依次加到前面的数上是3,4,5,6.
代码:
import java.math.BigInteger;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scc=new Scanner(System.in);
        BigInteger big1=new BigInteger("1");
        int a[]=new int[3000];
        int n;
        int sum=2;
        a[0]=2;
        n=scc.nextInt();
        int i=1;
        int j=0;
        while(true){
            a[i]=a[i-1]+1;
            if(sum+a[i]>n){
                break;
            }else{
                sum+=a[i];
            }
            i++;
        }
        a[i]=n-sum;
        j=i-1;
        while(a[i]!=0&&j>=0){
            a[j]++;
            a[i]--;
            j--;
        }
        j=i-1;
        while(a[i]!=0&&j>=0){
            a[j]++;
            a[i]--;
            j--;
        }
        for(int k=0;k<i-1;k++){
            System.out.print(a[k]+" ");
            big1=big1.multiply(BigInteger.valueOf(a[k]));
        }
        System.out.println(a[i-1]);
        big1=big1.multiply(BigInteger.valueOf(a[i-1]));
        System.out.println(big1.toString());
        

    }

}
 
原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5695208.html