C语言 “百鸡问题”最优解

“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
问题分析
cocks,hens,chicks;//公鸡、母鸡、小鸡
设公鸡为x,母鸡为y,小鸡为z,有以下关系

  1.    x+y+z=100,//根据百鸡的数目,得到的数学表达式
    
  2.   5x+3y+z/3=100,//根据百钱的数目,得到的数学表达式
    

下面再看看x,y,z的取值范围。
由于只有100文钱,
则5x<100 ===> 0<x<20,
同理 3y<100 ===> 0<y<33.333,
那么z=100-x-y,

好,现在我们已经分析清楚了,下面直接上代码了。
在这里插入图片描述

#include <stdio.h>
main( )
{
int cocks,hens,chicks;//公鸡、母鸡、小鸡
cocks=0;
while(cocks<=19)
  {
  hens=0;
  while(hens<=33)
    {
     chicks=100-cocks-hens;
     if(5*cocks+3*hens+chicks/3==100&&chicks%3==0)
     printf("%d,%d,%d\n",cocks,hens,chicks);
    hens=hens+1;
    }
  cocks=cocks+1;
  }
}

根据上述的调试结果,我们发现这样一个规律:
在这里插入图片描述
第一列公鸡数是4的倍数;
第二列母鸡数是以7为公差递减的;
第三列鸡崽数是3的倍数。
之前的代码:

  1.    x+y+z=100,//根据百鸡的数目,得到的数学表达式
    
  2. 5x+3y+z/3=100,//根据百钱的数目,得到的数学表达式
    

根据规律优化后
===========>
x+y+z=100 ①
5x+3y+z/3=100 ②

令②x3-① 可得
7x+4y=100

设x=4n,
则y=(100-28n)/4,即y=25-7n
所以z=75+3n
在这里插入图片描述
观察第一次调试结果,x的取值范围是[0,12],===>n的取值范围是[0,3]
再上代码,这是优化后的“最优解”哦:
在这里插入图片描述

#include <stdio.h>
main( )
{	int cocks,hens,chicks;//公鸡、母鸡、小鸡
	for(int n=0;n<=3;n++)
	{	cocks=4*n;
		hens=25-7*n;
		chicks=75+3*n;
		printf("%d,%d,%d\n",cocks,hens,chicks);
	 } 
}

简单不?简单的很呐!
数学是理科的“小王子”,这不是我第一次用数学知识解决编程问题了。类似的循环嵌套,哦,不,能够跟“数学问题”有关的,都可以用数学知识来解决,多动手尝试,多动手去发现“美”!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码写注释

请赞赏我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值