有人在群里问鸡兔同笼问题如何使用编程实现,我们这里先看看这个概念是什么。百度百科解释如下:
鸡兔同笼,是中国古代著名典型趣题之一,记载于《孙子算经》之中。鸡兔同笼问题,是小学奥数的常见题型。许多小学算术应用题和填空题都可以转化成这类问题,或者用解它的典型解法--"假设法"来求解。因此很有必要学会它的解法和思路。通常是假设法比较简单易懂一点。
历史
鸡兔同笼是中国古代的数学名题之一。大约在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}";
?>