求正整數n劃分因子乘積最大的一個劃分及此乘積

問題描述:java

   給定一個正整數n, 則在n全部的劃分中, 求因子乘積最大的一個劃分及此乘積。算法

   例如:8 = {8}, {7, 1}, {6, 2}, {5, 3}, {4, 4}, {3, 3, 2}, {2, 2, 2, 2} 等,那麼在這些當中,3 * 3 * 2 的乘積最大,因此輸出整個劃分{3,3,2}和這個乘積18.ide

算法分析:
spa

 一個結論:對於一個大於等於4的正整數m,存在一個2塊劃分的因子,這兩個因子的乘積老是不小於原數m自己。three

證實以下:ip

   (1)對於任意大於等於4的正整數m, 存在一個劃分m = m1+m2, 使 m1*m2 >= m證: 令m1 = int(m/2),  則 m1 >= 2 , m2 = m-m1; 那麼m2 > 2,而且 m2 >= m/2 >= m1;    m1*m2 >= 2*m2 >= m; 證畢;it

  (2)由(1)知此數最終能夠分解爲 2^r * 3^s。現證實 r <= 2;
  證:若r > 2, 則至少有3個因子爲2, 而2*2*2 < 3*3;
  因此能夠將3個爲2的因子,換爲兩個因子3;積更大;證畢。
  綜合(1),(2),則有:任何大於4的因子均可以有更好的分解, 而4能夠分解爲2*2。
  因此:此數應該分解爲 2^k1 * 3^k2。並且能夠證實 k1>=0 而且 k1 <= 2,所以:
     A.當n = 3*r 時, 分解爲 3^r
    B.當n = 3*r+1時, 分解爲 3^(r-1)*2*2
    C.當n = 3*r+2時, 分解爲 3^r*2
class

public int maxsplit(int n){
       int maxmultiply =1;
       if(n<=4){
           if(n<=0){
               return 0;
           }else if(n==1||n==2){
               return 1;
           }else if(n==3){
               return 2;
           }else
               return 4;
       }else{
           int numthree = n/3;
           if(n%3==0){            
               for(int i=1;i<=numthree;i++){
                   maxmultiply = 3*maxmultiply;
               }
           }
           else if(n%3==1){
               for(int i=0;i<numthree;i++){
                   maxmultiply=3*maxmultiply;
               }
               maxmultiply =maxmultiply*2*2;
           }else if(n%3==2){
               for(int i=0;i<numthree;i++){
                   maxmultiply=3*maxmultiply;
               }
               maxmultiply =maxmultiply*2;
           }
           return maxmultiply;
       }
   }

將上述結論推廣爲通常情形即是:
  把天然數S(S>1)分拆爲若干個天然數的和:   S=a1+a2+…+an,則當a1,a2,…,an中至多有兩個2,其他都是3時,其連乘積m=a1a2…an有最大值。margin

例2:把1993分拆成若干個互不相等的天然數的和,且使這些天然數的乘積最大,該乘積是多少?
解:因爲把1993分拆成若干個互不相等的天然數的和的分法只有有限種,於是必定存在一種分法,使得這些天然數的乘積最大。
  若1做因數,則顯然乘積不會最大。把1993分拆成若干個互不相等的天然數的和,因數個數越多,乘積越大。爲了使因數個數儘量地多,咱們把1993分紅2+3…+n直到和大於等於1993。
若和比1993大1,則因數個數至少減小1個,爲了使乘積最大,應去掉最小的2,並將最後一個數(最大)加上1。
若和比1993大k(k≠1),則去掉等於k的那個數,即可使乘積最大。
因此n=63。由於2015-1993=22,因此應去掉22,把1993分紅(2+3+…+21)+(23+24+…+63)di

這一形式時,這些數的乘積最大,其積爲  2×3×…×21×23×24×…×63。

相關文章
相關標籤/搜索