1. 程式人生 > >18.12.02-C語言練習:韓信點兵

18.12.02-C語言練習:韓信點兵

 

C語言練習:韓信點兵

 

題目說明:本題是中國經典問題,有多種解法,從數論課程角度看,是一個不定方程組,而且答案不唯一。

但這裡採用程式解法,使用的是暴力破解。列舉可能的解,然後根據條件判斷,滿足所有條件時的數字就是所求解。

 

程式:

 1 #include <stdio.h>
 2 
 3 int main(int argc, char *argv[]) {
 4     
 5     int ans = -1;
 6     int i;
 7     for(i=1; i<=10000; i += 5) {
 8         if
((i%6==5) && (i%7==4) && (i%11==10)) { 9 ans = i; 10 break; 11 } 12 } 13 if(ans!=-1) { 14 printf("There are %d soilders.\n", ans); 15 } else { 16 printf("There are no answer.\n"); 17 } 18 19 return 0; 20 }

 

程式解釋

6-7行:i 是迴圈變數,for迴圈中自增部分 i+=5,意思是按5自增,因初始值是 1, i 從 1 開始 每步加5,所以 i 的取值是 1,6, 11,... 這樣也就滿足了第一個條件。

8行:這裡有三個條件,1%6==5,就是從1至6報數,最末一個士兵報的數是5,;其餘兩個條件類似。

9 - 10行:執行到這一行,說明滿足所有條件,把 i 的值賦給變數ans保留結果; 然後在第10行利用break結束迴圈繼續執行,因為程式已經找到答案了。

執行結果

 

解不唯一,稍微改一下程式,得到在10000內的結果

 

 

 

知識擴充套件: 

本題從數學(數論)角度看是一個不定方程組問題,相關問題和知識可以參考這裡

孫子定理(又稱 中國剩餘定理) https://baike.baidu.com/item/%E5%AD%99%E5%AD%90%E5%AE%9A%E7%90%86/2841597?fr=aladdin

另外這裡有別人寫的類似的程式:https://www.cnblogs.com/freinds/p/6388992.html

有關不定方程組的問題可以隨便找一本數論書都可以看到相關詳細理論,這裡不再贅述。