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 }
View Code

 

posted @ 2020-10-30 12:02  古比  阅读(142)  评论(0编辑  收藏  举报