對給定的整數進行分解與重組,集成為滿足某些特定條件的陣列,是一項具有挑戰性的設計,也是一類非常有趣的智力遊戲;
本節探索「雙和3元2組」與「和積3元3組」兩個案例,注意分解的實施與重組條件「雙和」、「和積」的實現;
把給定偶數2n分解為6個互不相等的正整數a、b、c、d、e、f,然後把這6個數分成(a、b、c)與(d、e、f)兩個3元組,若這兩個3元組具有和相等且倒數和也相等的雙和相等特性:
則把3元組(a、b、c)與(d、e、f)(約定a< b< c,d< e< f,a< d)稱為基於n的雙和3元2組;
例如,對於n=26,存在基於26的雙和3元2組(4、10、12)和(5、6、15):
輸入正整數n(n<=100),搜尋基於n的所有雙和3元2組,若沒有探索到相應的雙和3元2組,則輸出「無解」;
1.說明:
因6個不同正整數之和至少為21,即整數n>=11;
(1)、列舉迴圈設定;
設定a,b與d,e列舉迴圈,注意到a+b+c=n,且a< b< c,因而a,b迴圈取值為:
c=n-a-b,以確保a+b+c=n;
設定d,e迴圈基本同上,注意到d>a,因而d起點為a+1;
(2)、檢驗倒數和相等;
把比較倒數和相等1/a+1/b+1/c=1/d+1/e+1/f 轉化為比較整式:
若等式不成立,即倒數和不相等,則返回;
(3)、省略相同整數的檢測;
注意到兩個3元組中若部分相同部分不同,不能有和相等且倒數和也相等,因而可省略排除以上6個正整數中是否存在相等的檢測;
若比較整式成立,列印輸出和為n的雙和3元2組,並用x統計解的個數;
2.程式設計:
#include#includeint main()
if(x>0)
printf("共以上%d組解!\n",x);
else
printf("無解!\n");
}
3.程式執行示例及其注意事項:
請輸入整數n:98
1: ( 2, 36, 60), ( 3, 5, 90);
2: ( 7, 28, 63), ( 8, 18, 72);
3: ( 7, 35, 56), ( 8, 20, 70);
4: ( 10, 33, 55), ( 12, 20, 66);
共以上4組解!
輸入n=26,即得唯一乙個雙和3元2組如上面敘述所示,輸入任何小於26的整數n均無解,可見存在雙和3元2組的n最小值為26;
注意:由迴圈設定可知列舉複雜度為o(n^4),顯然不適宜對較大整數n的雙和3元2組搜尋;
設n為正整數,試把整數3*n分解為9個互不相同的正整數a、b、c、d、e、f、g、h、i,然後把這9個正整數分成(a,b,c)、(d,e,f)與(g,h,i)共3個3元組,若這3個3元組具有和相等且積相等的兩個相等特性:
則把(a,b,c)、(d,e,f)與(g,h,i)(約定a< b< c,d< e< f,g< h< i,a< d< g)稱為乙個基於n的和積3元3組;
例如,給定n=45,探索到基於45的和積3元3組(4,20,21)、(5,12,28)和(7,8,30):
輸入正整數n(n<=100),搜尋基於n的所有和積3元3組,若沒有探索到相應的和積3元3組,則輸出「無解」;
1.說明:
因為9個不同正整數之和至少為45,故可知正整數n>14;
(1)、設定列舉迴圈;
注意到a+b+c=n,且a< b< c,因而a,b迴圈取值為:
c=n-a-b,以確保a< b< c且a+b+c=n;
設定d,e迴圈與g,h迴圈基本同上,只是注意到d>a,因而d起點為a+1;g>d,因而g起點為d+1;
(2)、檢測和積相等;
在設定的列舉迴圈中,確保了3個3元組和相等;
若a*b*c=d*e*f=g*h*i,即積也相等,滿足和積相等條件,搜尋到基於n的一組和積3元3組,用x統計組數;
(3)、省略相同整數的檢測;
注意到兩個和相等的3元組中,若等號兩邊有部分數相同部分數不同,不可能有積相等(證略);
因而可省略排除以上9個正整數中是否存在相同整數的檢測,即在檢測積相等時已排除出現整數相同的可能;
3.程式設計:
#include#includeint main()
}if(x>0)
printf("共以上%d組解!\n",x);
else
printf("無解!\n");
}
3.程式執行示例及其注意事項:
請輸入整數n:100
1: 6 45 49; 7 30 63; 9 21 70; (13230)
2: 10 42 48; 12 28 60; 15 21 64; (20160)
3: 16 39 45; 18 30 52; 20 26 54; (28080)
共以上3組解!
請執行程式,探索存在基於n的和積3元3組的整數n至少為多大?
注意:由迴圈設定可知列舉複雜度為o(n^6),顯然不適宜對較大整數n的和積3元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 ...
整數分解,取逆
整數的分解是c語言程式設計中常用遇到的問題,常用 和 運算子來完成這一操作,分解方式可分為向左分解和向右分解。對於任意整數number,可以進行以下操作 向左分解 先用 10提取最左邊數字,再用 10刪去最左邊資料,如此迴圈,直至number 0,這種做法的缺點後期需要調整輸出結果的順序 inclu...