简单计算题-鸡兔同笼

我国古代著名趣题之一。

《孙子算经》中这样描述:“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?”


先来正确解的完整代码:

#include <iostream>

int main()
{
  int rabbit, head, foot;

  std::cin >> head >> foot;


  rabbit = (foot - head * 2) / 2;


  if (rabbit * 4 + (head - rabbit) * 2 != foot)
     return -1;
  else
      std::cout << "chook has:" << head - rabbit
                << "\t"
                << "rabbit has:" << rabbit;


   return 0;
}

一般对于这种简单的问题,像博主这样的渣渣新手们通常想到的都是暴力破解:

双重循环便利所有可能组合,再进行判断筛选,代码如下:

    for (int t(1); t <= head; ++t)
    {
        for (int j(1); j <= head; ++j)
        {
            if (j + t == head && 4 * t +2 * j == foot)
                std:cout << .....;
        }
    }

简单暴力,不用想!就是这么任性!

虽然博主是刚刚入门的渣渣但本着为了世界和平(认真脸)也要提醒那些和博主一样的渣渣新手们,这种方法是非常不值得提倡的!不值得提倡!不值得提倡!

重要的事情说三遍 哈哈

且不说这样的代码会暴露自己的水平,复杂度N*N这个样子足以让你在数据量大的时候等的崩溃,搞不好还会溢出呢微笑

其实稍加思考,聪明一点的渣渣会想出这样的代码:

 for (int j(0); j <= head; ++j)
    {
        t = head - j;
        if (j * 2 + t * 4 == foot)
            std::cout << .....;
    }

这个代码时间复杂度为N,相比上一个代码而言,速度不知道提高了多少!

看吧,动脑子的作用就是这么神奇,稍加思考复杂度就从N*N 缩小到N,在你的聪明才智下心爱的电脑少算这么多次呢

你以为算到这里就结束了吗?少年,你真的too young too simple!!!

当初博主就是拿着这样一个自以为聪明的代码去找大神表扬,然后,然后就被现场碾压了


如何让复杂度直接变为1?

你没有听错,就是1!

对于刚刚了解基础语法的新手,在学会for之后基本上稍微多一点的数据就都往循环上扯

让我们来换一种思路

把它当成数学题来算:两个未知量,两个方程,让我们来解方程得意

设未知量j(鸡),t(兔). 有j + t = head; 2j + 4t = foot; 解方程之后有 t = (foot  -  2head)  / 2;

这不就皆大欢喜,一次计算就得出了结果!


具体代码如下:

    rabbit = (foot - head * 2) / 2;

//  我们定义rabbit为int型,所以在上一步计算中,当头脚数量不匹配时有可能出现数值截取现象
//  所以在之后的需要判断计算之后兔子和小鸡的脚数与输入的总脚数是否相等,如果不相等则无解,直接结束
    if (rabbit * 4 + (head - rabbit) * 2 != foot)
        return -1;
    else
        std::cout << "chook has:" << head - rabbit
                  << "\t"
                  << "rabbit has:" << rabbit;



通过这一道题,博主真的收获很多:

1、拿到问题不要直接就做,分析思考想明白之后再开始敲代码;

2、同一问题多和别人交流,说不定别人的方法会让你眼前一亮;

3、编程的时候不要只局限与语言的特性,要将问题实际化,多换几种思路,注重自己思考的过程并尽力将之实现在代码上(不会编程的时候我遇到这个问题大脑是如何思考的,如何得出答案的);

4、要学会考虑时间复杂度,尽可能让代码简单,高效;

4、多看到书、多编程、还是自己太太太太渣再见


*ps:欢迎各位大神不嫌弃渣进行指正批评,也欢迎各位比我还渣的同学提问,我们一起成长吐舌头

### 关于鸡兔同笼问题的Java编程实现 #### 示例代码 下面展示一段用于解决经典“鸡兔同笼”问题的Java程序: ```java import java.util.Scanner; public class ChickenRabbitProblem { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入头的数量:"); int heads = scanner.nextInt(); System.out.println("请输入脚的数量:"); int feet = scanner.nextInt(); solveChickenAndRabbits(heads, feet); scanner.close(); } private static void solveChickenAndRabbits(int heads, int feet) { // 假设全部都是兔子,则总共有4*heads只脚;每减少一只兔子增加一只鸡就会少两只脚。 int rabbits = (feet - 2 * heads) / 2; int chickens = heads - rabbits; if ((rabbits + chickens == heads) && (chickens >= 0) && (rabbits >= 0)) { System.out.printf("鸡有 %d 只,兔有 %d 只%n", chickens, rabbits); } else { System.out.println("无解"); } } } ``` 此段代码通过输入动物总数(即头数)以及腿的数目来计出具体有多少只鸡和多少只兔子。这里采用了一个简单的数学模型来进行求解:假设所有的动物都是兔子,那么应该有的脚的数量就是`4×headCount`。由于实际上存在一些两足行走的生物——也就是鸡,所以实际的脚数量会比这个理论值要小。因此可以通过差额除以二得到真正的兔子数量。 对于给定的一组数据,该法能够有效地找出符合条件的结果并打印出来[^1]。 #### 解题思路 针对此类线性方程组应用题,“鸡兔同笼”的核心在于建立合理的数学关系表达式,并利用已知条件对方程式进行简化处理。上述方法基于这样一个事实:如果我们把所有动物都当作四条腿的兔子来看待的话,那么超出部分正好对应着那些只有两条腿的家禽所缺少的部分。这样就可以很容易地出两种不同类型的动物各自的具体数目了。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值