百錢百雞問題C語言練習(二種算法)

我國古代數學家張丘建在《算經》一書中曾提出過著名的“百錢買百雞”問題,該問題敘述如下:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一;百錢買百雞,則翁、母、雛各幾何?

翻譯過來,意思是公雞一個五塊錢,母雞一個三塊錢,小雞三個一塊錢,現在要用一百塊錢買一百隻雞,問公雞、母雞、小雞各多少隻?

這個題目經常拿來做c語言的練習,是一道鍛鍊學生的題目,首先要分析題目並得出算法,然後根據算法編程。
編程並不是很複雜的問題,本文提供二種算法,請大家比較優劣(大家可以把100變成1000、100000… 進行測試)。

一、先寫出方程,然後對方程的用一個變量表示,對該變量進行循環,循環次數爲100/5=20。
其優點是對雞的總數和錢的總數都可以定義,也可以變成千錢千雞問題,而且只有一個循環。

/*
百錢百雞問題及擴展
5x+3y+z/3=100
x+y+z = 100
*/

#include<stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int a,b;

    printf("輸入錢總數和雞總數:\n");
    scanf("%d,%d",&a,&b);
    subx(a,b);

    return 0;
}

/*
5x+3y+z/3=a
x+y+z=b

then:
5x<=a,x>=0,y>=0,z>=0
y=(3a-b-14x)/8
z=3(a-5x-3y)
x+y+z=b

*/
int subx(int a,int b)
{
    int x,y,z;
    for(x=1;x<=a/5;x++)
    {
        y = (3*a-b-14*x)/8;
        z = 3*(a-5*x-3*y);
        int t=x+y+z;
        if(t==b && x>=0 &&y>=0 && z>=0) printf("公雞=%d,母雞=%d,小雞=%d\n",x,y,z);
    }     
    return 0;
}

二、直接使用窮舉法的方式來解題,
優點,思路很簡單,不需要再算法上多花時間,但擴展性較差,需要三個循環,對於百錢百雞問題,不存在障礙,
需要 101^3 次猜解,這對於計算機來說是小 CASE!如果擴展出去,循環量增加將導致計算量大幅度上升。
(參見 http://c.biancheng.net/view/500.html

代碼清單:

/*
設公雞 x 只,母雞 y 只,小雞 z 只,得到以下方程式組:
A:5x+3y+1/3z = 100
B:x+y+z = 100
C:0 <= x <= 100
D:0 <= y <= 100
E:0 <= z <= 100
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int a,b;

    printf("輸入錢總數和雞總數:\n");
    scanf("%d,%d",&a,&b);
    subx(a,b);

    return 0;
}

int subx(int a,int b)
{
    int i, j, k;

    printf("問題所有可能的解如下:\n");

    for( i=0; i <= b; i++ )
        for( j=0; j <= b; j++ )
            for( k=0; k <= b; k++ )
            {
                if( 5*i+3*j+k/3==a && k%3==0 && i+j+k==b )
                {
                    printf("公雞=%d,母雞=%d,小雞=%d\n", i, j, k);
                }
            }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章