1. 程式人生 > >C語言百錢百雞問題程式碼及解析

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

C語言百錢百雞問題程式碼及解析

補充說明:根據這三層迴圈可得到多種方案,但有些事不符合條件的,因此結果輸出之前需要篩選合理方案,控制條件語句為:

if((5*cock+3*hen+chicken/3==100) && (cock+hen+chicken==100))