“百鸡问题”:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
问题分析
cocks,hens,chicks;//公鸡、母鸡、小鸡
设公鸡为x,母鸡为y,小鸡为z,有以下关系
-
x+y+z=100,//根据百鸡的数目,得到的数学表达式
-
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的倍数。
之前的代码:
-
x+y+z=100,//根据百鸡的数目,得到的数学表达式
-
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);
}
}
简单不?简单的很呐!
数学是理科的“小王子”,这不是我第一次用数学知识解决编程问题了。类似的循环嵌套,哦,不,能够跟“数学问题”有关的,都可以用数学知识来解决,多动手尝试,多动手去发现“美”!