• 鸡兔同笼问题


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

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

    历史

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

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

  • 相关阅读:
    TestNG(二)
    TestNG(一)
    设计模式(一)单例模式
    Locust学习笔记1-性能工具的选择
    使用postman工具做接口测试(七)——全局(Global)变量和环境(Environment)变量的使用
    使用postman工具做接口测试(六)——post 请求(application/json和application/x-www-from-urlencoded)
    接口测试理论
    使用Postman工具做接口测试(五)——生成随机参数
    MyBatis-Plus 构建查询条件说明
    win10解决端口被占用问题
  • 原文地址:https://www.cnblogs.com/lizhaoyao/p/7484321.html
Copyright © 2020-2023  润新知