1. 程式人生 > >求劃分因子乘積最大的一個劃分及此乘積

求劃分因子乘積最大的一個劃分及此乘積

等於 簡單 給定 int 大於 例如 整數劃分 特殊情況 算法

求劃分因子乘積最大的一個劃分及此乘積
  問題簡述:給定一個正整數n, 則在n所有的劃分中, 求因子乘積最大的一個劃分及此乘積。例如:8 = {8}, {7, 1}, {6, 2}, {5, 3}, {4, 4}, {3, 3, 2}, {2, 2, 2, 2} 等,那麽在這些當中,3 * 3 * 2 的乘積最大,所以輸出整個劃分
和這個乘積 18。
  算法分析:這是我在某個論壇上看到的問題,以及別人針對此問題的數學分析,現簡單的整理如下:
  (1)對於任意大於等於4的正整數m, 存在一個劃分m = m1+m2, 使 m1m2 >= m證: 令m1 = int(m/2), 則 m1 >= 2 , m2 = m-m1; 那麽m2 > 2,並且 m2 >= m/2 >= m1; m1

m2 >= 2m2 >= m; 證畢;
該證明簡單的來說就是:對於一個大於等於4的正整數m,存在一個2塊劃分的因子,這兩個因子的乘積總是不小於原數m本身。
  (2)由(1)知此數最終可以分解為 2^r
3^s。現證明 r <= 2;
  證:若r > 2, 則至少有3個因子為2, 而222 < 33;
  所以可以將3個為2的因子,換為兩個因子3;積更大;證畢。
  綜合(1),(2),則有:任何大於4的因子都可以有更好的分解, 而4可以分解為2
2。
  所以:此數應該分解為 2^k1 * 3^k2。而且可以證明 k1>=0 並且 k1 <= 2,因此:
   A.當n = 3r 時, 分解為 3^r
   B.當n = 3
r+1時, 分解為 3^(r-1)22
  C.當n = 3r+2時, 分解為 3^r2
  剩下編程處理,那就是太簡單了,首先是處理 <= 4的特殊情況,再對>4的情況進行模3的3種情況的判斷,最後一一輸出。可見,數學在整數劃分問題上有太強的功能。誰叫這個問題叫整數劃分呢,不與數學密切才怪! ^_^。

求劃分因子乘積最大的一個劃分及此乘積