【贪心】最大乘积-贪心-高精度-java
<center>
提交: 34 解决: 10
[提交][状态][讨论版] </center>
问题 G: 【贪心】最大乘积
时间限制: 1 Sec 内存限制: 128 MB提交: 34 解决: 10
[提交][状态][讨论版] </center>
题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。
现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
现在你的任务是将指定的正整数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()); } }