1.問題描述
把2010分解為若干個互不相同的正整數之和,使這些互不相同的正整數之積最大。
2.設計要點
進行一般化處理,把指定正整數n分解為若干個互不相同的正整數之和,使這些互不相同的正整數之積最大。
設使積最大的化零分解中,最小零數為c,最大零數為d。
⑴c>1。若c=1,去掉零數1,把1加至最大零數,顯然積會增大。
⑵零數按由小到大排列,從c到d的零數序列中,中間的空數(不在零數序列中的數)不能多於1個。
設序列中有兩個空數x、y,滿足a(i)<x<y<a(j),其中a(i)、a(j)為零數序列中的項(i<j),x=a(i)+1,y=a(j)-1。因a(i)+a(j)=x+y,而
a(j)>a(i)+1 => x*y = (a(i)+1)*(a(j)-1) > a(i)*a(j)
即把a(i)、a(j)兩個零數分別換成x、y後,和不變而積增加,與所設各人最大矛盾。
⑶c<4,即c只能取2、3。
若c=4,此時若5在序列中,把5化為2+3,積增加;若5不在序列中而6在序列中,把4、6化為2、3、5,顯然和不變而積增加;若5、6都不在序列中,與上述⑵矛盾。
若c>4,把c化為2與c-2,顯然2(c-2)>c,積增加。
因此,把指定的n轉化為以2或3開始的連續的或至多一個空數的正整數序列,相應的積達最大。
3.代碼實現
#include "stdafx.h"<br />#include <math.h> </p><p>// 積最大的整數分解程式設計<br />int main(void)<br />{<br />int a, c, d, h, k, n, s;<br />double t;</p><p>printf("把正整數n分解為若干個互不相同的正數數之和,使積最大。/n");<br />printf("請輸入正整數n:");<br />scanf("%d", &n);</p><p>s = 0; h = 0; a = 1;<br />while (s <= n) {// 此時s-n可能為1,2,...,a<br />a++;<br />s += a;<br />}<br />if (s - n == a) {// n分解為2至a-1的連續序列<br />c = 2;<br />d = a - 1;<br />}<br />else if (s - n == 2) {// n分解為3至a的連續序列<br />c = 3;<br />d = a;<br />}<br />else if (s - n == 1) {// n分解為3至a+1(不含a)<br />c = 3;<br />d = a + 1;<br />h = a;<br />}<br />else {// n分解為2至a(不含s-n)<br />c = 2;<br />d = a;<br />h = s - n;<br />}</p><p>printf("%d分解為:%d--%d", n, c, d);<br />if (h > 0)<br />printf("(不包含其中的數%d)", h);<br />printf("/n其積最大為:");<br />t = 1;<br />for (k = c; k <= d; k++)<br />t *= k;<br />if (h > 0)<br />t /= h;</p><p>printf("%.0f/n", t);</p><p>return 0;<br />}