一、問題描述
設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 ...