鸡兔同笼问题

有人在群里问鸡兔同笼问题如何使用编程实现,我们这里先看看这个概念是什么。百度百科解释如下:

鸡兔同笼,是中国古代著名典型趣题之一,记载于《孙子算经》之中。鸡兔同笼问题,是小学奥数的常见题型。许多小学算术应用题和填空题都可以转化成这类问题,或者用解它的典型解法--"假设法"来求解。因此很有必要学会它的解法和思路。通常是假设法比较简单易懂一点。

历史

鸡兔同笼是中国古代的数学名题之一。大约在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}";
?>

其实应该还有其他的方法,欢迎留言和我探讨。

posted @ 2017-09-06 13:17  李照耀  阅读(2097)  评论(1编辑  收藏  举报