鸡兔同笼问题
有人在群里问鸡兔同笼问题如何使用编程实现,我们这里先看看这个概念是什么。百度百科解释如下:
鸡兔同笼,是中国古代著名典型趣题之一,记载于《孙子算经》之中。鸡兔同笼问题,是小学奥数的常见题型。许多小学算术应用题和填空题都可以转化成这类问题,或者用解它的典型解法--"假设法"来求解。因此很有必要学会它的解法和思路。通常是假设法比较简单易懂一点。
历史
鸡兔同笼是中国古代的数学名题之一。大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:
-
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
这四句话的意思是:
-
有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
最简单的方法实现如下:
<?php // 解法1 双重循环鸡兔 (这也是最基础的循环解法) // 鸡+兔=35 // 2*鸡+4*兔=94 $total_head=35; for ($chicken=1; $chicken < $total_head; $chicken++) { for ($rabbit=1; $rabbit < $total_head; $rabbit++) { if(($rabbit+$chicken==$total_head) && (2*$chicken + 4*$rabbit==94)) { echo "chiken:{$chicken}---rabbit:{$rabbit}"; break 2; } } } ?>
这个是比较傻的用两个变量来循环 循环之后还判断两个条件同时满足,然后就结束循环。
稍微提升一点是下面这样的做法
<?php // 解法2 循环鸡的数量 算出兔子的数量 // 鸡+兔=35 // 2*鸡+4*兔=94 $total_head=35; for ($chicken=1; $chicken < $total_head; $chicken++) {
$rabbit=$total_head-$chicken; if(2*$chicken + 4*$rabbit==94) { echo "chiken:{$chicken}---rabbit:{$rabbit}"; break; } } ?>
或者是这样的
<?php // 解法3 循环兔子的数量 计算鸡的数量 通常情况下可以循环少一点(仔细想想这是为什么) // 鸡+兔=35 // 2*鸡+4*兔=94 $total_head=35; for ($rabbit=1; $rabbit < $total_head; $rabbit++) {
$chicken=$total_head-$rabbit; if(2*$chicken + 4*$rabbit==94) { echo "chiken:{$chicken}---rabbit:{$rabbit}"; break; } } ?>
使用一个变量取代着表示另外一个变量然后完成这个循环 就稍微简单一点
下面的解法思路上稍微要绕个弯了
<?php // 解法4 砍足法 // 鸡+兔=35 // 2*鸡+4*兔=94 // 所有的动物砍掉两条腿 那么 鸡没有腿 兔子少两条腿 35个脑袋 应砍掉70条腿 // 剩余的94-70=24 都是兔子腿,则兔子24/2=12 鸡 35-12=23 $total_head=35; $total_foot=94; $rabbit=($total_foot-2*$total_head)/2; $chicken=$total_head-$rabbit; echo "chicken:{$chicken}---rabbit:{$rabbit}"; ?>
或者是这样
<?php // 解法5 增足法 // 鸡+兔=35 // 2*鸡+4*兔=94 // 所有的鸡增加两条腿 那么 鸡兔都是四条腿了 35个脑袋 应该有 35*4=140条腿 // 多出来的腿都是鸡的腿 多出来140-94=46,则鸡有46/2=23 兔子 35-23=12 $total_head=35; $total_foot=94; $chicken=(4*$total_head-$total_foot)/2; $rabbit=$total_head-$chicken; echo "chicken:{$chicken}---rabbit:{$rabbit}"; ?>
其实应该还有其他的方法,欢迎留言和我探讨。