您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用C語言處理算經中的百錢百雞問題,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
中國古代數學家張丘健在他的 《算經》 中提出了一個著名的 “百錢百雞問題” ???? 一只公雞值五錢,一只母雞值三錢,三只小雞值一錢,現在要用百錢買百雞,請問公雞、母雞、小雞各多少只?
如果用百錢只買公雞,最多可以買20只,但題目要求買一百只,所以公雞數量在 0~20 之間。 同理,母雞數量在 0~33 之間。 在此把公雞、母雞和小雞的數量分別設為cock、hen、chicken,則 c o c k + h e n + c h i c k e n = 100 cock+hen+chicken=100 cock+hen+chicken=100 因此百錢買百雞問題就轉換成解不定方程組的問題了:
對于不定方程組,我們可以利用窮舉循環的方法來解決。 公雞范圍是 0~20,可用語句for(cock=0; cock<=20; cock++)
實現。 錢的數量是固定的,要買的雞的數量也是固定的,母雞數量是受到公雞數量限制的。 同理,小雞數量受到公雞和母雞數量的限制,因此可以利用三層循環的嵌套來解決:第一層循環控制公雞數量,第二層控制母雞數量,最里層控制小雞數量。
????
#include <stdio.h> int main() { int cock = 0; int hen = 0; int chicken = 0; for (cock = 0; cock <= 20; cock++) //外層循環控制公雞數量取值范圍0~20 { for (hen = 0; hen <= 33; hen++) //中層循環控制母雞數量取值范圍0~30 { for (chicken = 0; chicken <= 100; chicken++) //內層循環控制小雞數量取值范圍0~100 { //在內外層循環條件控制下小雞數量的取值限制用難一組解的合理性 if ((5*cock + 3*hen + chicken/3.0 == 100) && (cock + hen + chicken == 100)) { printf("cock=%2d, hen=%2d, chicken=%2d\n", cock, hen, chicken); } } } } return 0; }
運行結果????
以上算法需要窮舉嘗試 21 ? 34 ? 101 = 72114 21 *34*101=72114 21?34?101=72114 次,算法的效率明顯太低了。 對于本題來說,公雞的數量確定后,小雞的數量就是固定為 100 ? c o c k ? h e n 100-cock-hen 100?cock?hen,無須進行窮舉了。 此時約束條件就只有一個: 5 ? c o c k + 3 ? h e n + c h i c k e n / 3 = 100 5*cock+3*hen+chicken/3=100 5?cock+3?hen+chicken/3=100。 這樣我們利用兩重循環即可實現。
此算法只需嘗試 21 ? 34 = 714 21 * 34 = 714 21?34=714 次,實現時約束條件中限定了chicken必須能被3整除。 只有chicken能被3整除時才會繼續進行約束條件 5 ? c o c k + 3 ? h e n + c h i c k e n / 3 = 100 5*cock+3*hen+chicken/3=100 5?cock+3?hen+chicken/3=100 的判斷。 這樣省去了chicken不能被3整除時需要進行的算術計算和條件判斷,進一步提高了算法的效率。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用C語言處理算經中的百錢百雞問題”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。