正整數分解使得乘積最大問題

2021-07-30 10:52:43 字數 1401 閱讀 5822

一、問題描述

設n是乙個正整數。現在要求將n分解為若干個自然數之和,使得自然數的成績最大。輸出這個最大的乘積。

要求:(1)要求這些自然數互不相同

(2)要求這些自然數可以是相同的

二、問題分析:

這類題一開始需要我們手寫幾個數來看看規律。先做第一問,要求自然數互不相同。從5開始寫起,5=2+3,6=2+4,7=3+4,8=3+5,9=2+3+4,10=2+3+5,11=2+4+5

發現規律如下:

(1)盡量使得元素是連續的。

(2)如果有多出來的,從後往前均勻分配到各個元素。考慮到一種特殊情況,當多出來的數比前面已有元素的個數大1時(比如8的情況),先給已有元素的最大元素加1,然後再均勻分配到每個元素。

下面舉個栗子,看看攜程實習生招聘筆試的這道題:

題目描述:乘積最大

有乙個整數n,將n分解成若干個不同自然數之和,問如何分解能使這些數的乘積最大,輸出這個乘積m。

輸入:乙個整數,不超過50 輸出

乙個整數

樣例輸入 15

樣例輸出

144

c++**實現:

#include#includeusing namespacestd;

int main();

int k=2;

int i=0;

while(num >= k)

if(num > 0)

for(int j=i-1;j>=0 &&num>0;j--)

}int result = 1;

for(int j = 0;j

對於第二問,對於元素可以是相同的

仍然是通過手寫幾個數檢視一下規律:4=2+2,5=2+3,6=3+3,7=3+2+2,8=3+3+2,9=3+3+3。

發現規律如下:

(1)元素不會超過4,因為4=2+2,又可以轉化為2的問題,而5=2+3,5<2*3,所以5總能分解成2和3。

(2)盡可能多分解出3,然後分解出2,不要分出1。

考慮任意乙個數,除以3之後的結果有以下3種:

(1)能被3除斷,那麼就分解為3+3+...+3的情況即可。例如9=3+3+3。

(2)被3除餘1,分解為3+3+...+3+2+2或者3+3+...+3+4的情況,例如10=3+3+2+2

(3)被3除餘2,分解為3+3+...+3+2的情況,例如11=3+3+3+2。

c++**:

#include#includeusingnamespace std;

int main(){

int num;

while(cin>>num){

if(num % 3 == 0){ //考慮被3整除的情況

cout<

數論 正整數分解使得乘積最大

引入問題 要求將乙個正整數n分成幾個自然數的和,使這些自然數的乘積最大。輸出這個最大值。分兩種要求 1 這些自然數可以相同 2 這些自然數互不相同 同乙個數n,1的結果應該比2大 分析 只分析n 4的情況,因為n 4最大值都是本身 1.這些自然數可以相同 我們先列幾個數找找規律 4 2 2 5 3 ...

正整數分解

程式整體思路 分解就是乙個數減1,這個數後面的數加1 一次分解之後 找到最後乙個比1大的元素座標,然後與上一次相比,如果座標發生了偏移,那麼會發生向後偏移,說明又開始有乙個數需要分解,這個時候需要增加乙個元素,該情況下其實就是新出現了2 此時這個座標是2所在的位置 將2分解完畢之後,再繼續找比1大的...

正整數分解演算法

問題 將以正整數n表示成一系列正整數之和.n n1 n2 n3 nk n1 n2 n3 nk 1,k 1 這就是正整數n的乙個劃分,正整數n不同的劃分個數稱為正整數n的劃分數,記作p n 例如 6 有如下11種劃分則p 6 116 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 ...