计算机求百钱买百鸡问题采用,5.5 百钱买百鸡问题

5.5  百钱买百鸡问题

【题目要求】

我国古代数学家张丘建在《算经》一书中曾提出过著名的"百钱买百鸡"问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?请编写C程序,解决"百钱买百鸡"问题。

【题目分析】

如果用数学的方法解决百钱买百鸡问题,可将该问题抽象成如下的方程组:

设鸡翁x只,鸡母y只,鸡雏z只。

5ba6ff45dfb3d4cd1d12abaa148bddb5.png

显然该方程组应有无数多解,因为根据代数知识,该方程组必有一个自由未知数,因此其解是无数组的。但是作为一个实际问题,其解是有限的。因为这里有约束条件:所有解(x、y、z取值)必须为正整数。所以,这就把该问题的解集放到了一个有限的空间内来进行讨论。

因此,解决百钱买百鸡问题最为直观的方法就是在(x、y、z)的取值空间上穷举出所有可能的取值,只要(x、y、z)的取值满足上述两个方程,就一定是百钱买百鸡问题的解。

现在讨论(x、y、z)的取值空间。最简单的划分方法就是:x、y、z∈R且e13d49be10ec6b8e139e17484ff9c234.pngf58dc9d6a47bf689c61c2800e6edd150.png 。这是因为无论x、y、z都不可能超过100或小于0,且x、y、z均为正整数。因此,百钱买百鸡问题的解空间大小为1013,即就是要穷举出这1013个可能的解,并在这1013个可能的解中找出百钱买百鸡问题的真正的解。

百钱买百鸡的算法描述如下:

f3ea1fc38b68a859506c5a15f5f84809.png

上述算法利用了三重循环遍历了整个(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所示。

78c9d491d3de09b2ea5ca9735f6ac1b8.png

图5-5  程序5-5的运行结果

【责任编辑:云霞 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值