洛谷P1249
题目描述
一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+23=1+2,4=1+34=1+3,5=1+4=2+35=1+4=2+3,6=1+5=2+46=1+5=2+4。
现在你的任务是将指定的正整数 nn 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
输入格式
只一个正整数 nn,(3 \leq n \leq 100003≤n≤10000)。
输出格式
第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。
第二行是最大的乘积。
import java.util.Scanner;
import java.math.*;
public class Main {
public static void main(String[] args){
input();
}
public static void input(){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
f(n);
}
public static void f(int n){
int result=1;
int[] number=new int[5000];
int init=1;
number[0]=1;
while(result<n){
init++;
number[init-1]=init;
result+=init;
}
if(result==n){
if(init<3){
ff(number,init);
}
else{
number[0]=0;
number[init-1]++;
ff(number,init);
}
}
else{
int extra=result-n;
number[extra-1]=0;
if(init-1<3){
ff(number,init);
}
else{
if(number[0]==1){
number[0]=0;
if(extra!=2)
number[extra-2]++;
else
number[init-1]++;
}
ff(number,init);
}
}
}
public static void ff(int[] a,int chang){
BigInteger bi=BigInteger.ONE;
for(int i=0;i<chang;i++){
if(a[i]!=0){
bi=bi.multiply(new BigInteger(a[i]+""));
System.out.print(a[i]+" ");
}
}
System.out.println();
System.out.println(bi);
}
}