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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM