C語言百錢百雞問題程式碼及解析
問題描述
中國古代數學家張丘健在他的《算經》中提出了一個著名的“百錢白雞問題”:一隻公雞值五錢,一隻母雞值三錢,三隻小雞值一錢,現在要用百錢買百雞,請問公雞、母雞、小雞各多少隻?
問題分析
如果用百錢只買公雞,最多可以買20只,但題目要求買一百隻,所以公雞數量在0~20之間。同理,母雞數量在0~33之間。在此把公雞、母雞和小雞的數量分別設為cock、hen、chicken,則 cock+hen+chicken=100,因此百錢買百雞問題就轉換成解不定方程組的問題了:
演算法設計
對於不定方程組,我們可以利用窮舉迴圈的方法來解決,也就是通過對未知數可變範圍的窮舉驗證方程在什麼情況下成立,從而得到相應的解。公雞範圍是0~20,可用語句for(cock=0; cock<=20; cock++)實現。錢的數量是固定的,要買的雞的數量也是固定的,母雞數量是受到公雞數量限制的,同理,小雞數量受到公雞和母雞數量的限制,因此可以利用三層迴圈的巢狀來解決:第一層迴圈控制公雞數量,第二層控制母雞數量,最裡層控制小雞數量。即:
for(cock=0; cock<=20; cock++) //外層迴圈控制公雞數量範圍
for(hen=0; hen<=33; hen++) //內層迴圈控制母雞數量範圍
for(chicken=0; chicken<=100; chicken++) //內層迴圈控制小雞數量範圍
{
//條件控制
printf(“cock=%2d, hen=%2d, chicken=%2d\n”, cock, hen, chicken);
}
下面是完整的程式碼:
#include<stdio.h>
int main()
{
int cock, hen, chicken;
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, en=%2d, chicken=%2d\n", cock, hen, chicken);
}
}
執行結果:
cock= 0, en=25, chicken=75
cock= 4, en=18, chicken=78
cock= 8, en=11, chicken=81
cock=12, en= 4, chicken=84
補充說明:根據這三層迴圈可得到多種方案,但有些事不符合條件的,因此結果輸出之前需要篩選合理方案,控制條件語句為:
if((5*cock+3*hen+chicken/3==100) && (cock+hen+chicken==100))