我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
这个题目经常拿来做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;
}