P1249 最大乘积 JAVA大数
题意:给出一个数n,让我们把他拆分成若干个不相同的数相加的形式,最后权值为这些数相乘
求最大值
思路:贪心做法+高精度
我们从2开始枚举数,并且把它纳入拆分n的队列(在代码中用vis标记为1的就是在队列中)中,直到纳入的数相加起来大于等于n的时候,我们停止
然后求出目前与n的差值
如果差值等于0,不用操作
如果差值等于1,就舍去2,然后最大的数+1;
如果差值超过1,就直接舍去队列中这个差值的数
最后再把所有的数相乘即可
1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 5 6 public class Main { 7 public static void main(String[] args) { 8 int []vis = new int[10010]; 9 int []res = new int[10010]; 10 Scanner cin = new Scanner(System.in); 11 int n = cin.nextInt(); 12 if(n==3){ 13 System.out.println("1 2"); 14 System.out.println(2); 15 } 16 else { 17 int num = 0; 18 int flag=0; 19 for (int i = 2; i <= n; i++) { 20 num += i; 21 vis[i]=1; 22 if(num>=n){ 23 flag=num-n; 24 if(flag>=2){ 25 vis[flag]=0; 26 } 27 if(flag==1){ 28 vis[2]=0; 29 vis[i]=0; 30 vis[i+1]=1; 31 } 32 break; 33 } 34 } 35 int index = 0; 36 BigInteger ans= BigInteger.ONE; 37 for(int i=2;i<=n;i++){ 38 if(vis[i]==1){ 39 res[++index]=i; 40 BigInteger tmp = BigInteger.valueOf(i); 41 ans=ans.multiply(tmp); 42 } 43 } 44 for(int i=1;i<index;i++){ 45 System.out.print(res[i]+" "); 46 } 47 System.out.println(res[index]); 48 System.out.println(ans); 49 50 } 51 } 52 }