5.5 百钱买百鸡问题
【题目要求】
我国古代数学家张丘建在《算经》一书中曾提出过著名的"百钱买百鸡"问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?请编写C程序,解决"百钱买百鸡"问题。
【题目分析】
如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成如下的方程组:
设鸡翁x只,鸡母y只,鸡雏z只。
则
显然该方程组应有无数多解,因为根据代数知识,该方程组必有一个自由未知数,因此其解是无数组的。但是作为一个实际问题,其解是有限的。因为这里有约束条件:所有解(x、y、z取值)必须为正整数。所以,这就把该问题的解集放到了一个有限的空间内来进行讨论。
因此,解决百钱买百鸡问题最为直观的方法就是在(x、y、z)的取值空间上穷举出所有可能的取值,只要(x、y、z)的取值满足上述两个方程,就一定是百钱买百鸡问题的解。
现在讨论(x、y、z)的取值空间。最简单的划分方法就是:x、y、z∈R且 ; 。这是因为无论x、y、z都不可能超过100或小于0,且x、y、z均为正整数。因此,百钱买百鸡问题的解空间大小为1013,即就是要穷举出这1013个可能的解,并在这1013个可能的解中找出百钱买百鸡问题的真正的解。
百钱买百鸡的算法描述如下:
上述算法利用了三重循环遍历了整个(x、y、z)的取值空间,然后从中找出该问题 的解。
程序清单5-5/*-------------------------------- 5-5.c
--------------------------*/
#include
#include
int accord(int i,int j,int k) ;
void main()
{
int i,j,k;
printf("The possible plans for buying 100
fowls with 100 yuan are:\n\n");
for(i=0;i<=100;i++)
for(j=0;j<=100;j++)
for(k=0;k<=100;k++)
if(accord(i,j,k))
printf("cock=%d,hen=%d,chicken=%d\n",i,j,k);
getchar();
}
int accord(int i,int j,int k)
{
if(5*i+3*j+k/3==100&&k%3==0&&i+j+k==100)
/*显然k必为3的整数倍*/
return 1;
/*符合百千百鸡要求返回1*/
else
return 0;
/*不符合百千百鸡要求返回0*/
}
【程序说明】
程序中判断i、j、k是否满足方程组时,加k%3==0约束条件的原因是k为整型数据,因此k/3的结果会自动舍弃小数部分,这样会造成误差(例如78/3=26,80/3=26),影响最终结果。而这里显然k必为3的整数倍,因此增加约束条件k%3==0。
程序的运行结果如图5-5所示。
图5-5 程序5-5的运行结果
【责任编辑:云霞 TEL:(010)68476606】
点赞 0