百钱百鸡问题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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章