B2614 【深基1.习6】鸡兔共笼

一、题目理解

1.1 题目背景

鸡兔同笼是中国古代著名的数学问题。笼子里有若干只鸡和兔子,已知头的总数和脚的总数,问鸡和兔各有多少只。

1.2 题目要求

已知头的总数为 35,脚的总数为 94,求鸡和兔各有多少只。

已知条件:

  • 鸡有 1 个头、2 只脚

  • 兔有 1 个头、4 只脚

  • 头的总数:35

  • 脚的总数:94

输出要求:

  • 输出兔的数量和鸡的数量,用空格隔开,各占一行(本题只有一组解)

1.3 样例模拟

我们手动算一下:

  • 假设兔有 23 只,鸡有 12 只。

  • 头数:23 + 12 = 35,符合。

  • 脚数:23 × 4 + 12 × 2 = 92 + 24 = 116,不符合。

再试:

  • 假设兔有 12 只,鸡有 23 只。

  • 头数:12 + 23 = 35,符合。

  • 脚数:12 × 4 + 23 × 2 = 48 + 46 = 94,符合!

所以答案是:兔 12 只,鸡 23 只。

 
 

二、核心思想:枚举法(穷举法)

2.1 什么是枚举法?

想象笼子里的兔子数量可能是 0 到 35 之间的任意一个整数。

  • 如果兔有 0 只,那么鸡就有 35 只,算一算脚数对不对。

  • 如果兔有 1 只,那么鸡就有 34 只,算一算脚数对不对。

  • 如果兔有 2 只,那么鸡就有 33 只,算一算脚数对不对。

  • ……

  • 一直试到兔有 35 只。

只要某一种情况下脚数正好等于 94,就找到了答案。

2.2 为什么这种方法可行?

因为兔的数量一定在 0 到 35 之间(不可能超过头的总数),所以最多只需要试 36 种情况。计算机每秒能执行上亿次运算,36 次循环瞬间就能完成。这种方法虽然“笨”,但胜在简单、可靠、不易出错。

2.3 枚举法的通用套路

枚举法通常包含三个步骤:

  1. 确定枚举范围:本题中兔的数量从 0 到 35。

  2. 确定验证条件:脚数等于 94,头数等于 35。

  3. 遍历所有可能:用循环逐一检查,满足条件就输出。

 

三、程序执行流程逐步解析

下面按照程序实际执行的顺序,逐步讲解每一步在做什么。所有代码片段在文末统一给出,这里只讲逻辑。

【第 1 步】定义全局常量

在程序开头定义两个全局变量:

  • jiao = 94,表示脚的总数。

  • tou = 35,表示头的总数。

为什么用全局变量?

因为这两个值在程序的多个地方都会用到(循环条件和判断条件),定义成全局变量方便访问,也方便修改。如果以后题目变成“头 30、脚 80”,只需要改这两个值即可。

【第 2 步】程序开始

程序从主函数开始执行。

【第 3 步】外层循环:枚举兔的数量

循环变量 tu 从 0 开始,每次加 1,直到 tu 大于 35 时停止。

  • tu = 0:假设兔有 0 只

  • tu = 1:假设兔有 1 只

  • tu = 2:假设兔有 2 只

  • ……

  • tu = 35:假设兔有 35 只

为什么兔的上限是 35?

因为头的总数是 35,兔的只数不可能超过头的总数。如果兔有 36 只,那头数至少是 36,已经超过 35 了,不可能。

【第 4 步】计算鸡的数量

对于每一个假设的兔的数量 tu,鸡的数量 ji 可以通过头数关系算出:

ji = tou - tu

为什么?

因为每只鸡和每只兔都只有 1 个头,所以头的总数 = 鸡的数量 + 兔的数量。
因此:鸡的数量 = 头的总数 - 兔的数量。

例如:

  • tu = 0 时,ji = 35 - 0 = 35

  • tu = 1 时,ji = 35 - 1 = 34

  • tu = 12 时,ji = 35 - 12 = 23

【第 5 步】验证条件

对于每一组(tu, ji),检查两个条件是否同时满足:

条件一:脚的总数是否正确

每只兔有 4 只脚,每只鸡有 2 只脚。

脚的总数 = tu × 4 + ji × 2

要求这个值等于 jiao(即 94)。

条件二:头的总数是否正确

头的总数 = tu + ji

要求这个值等于 tou(即 35)。

注意: 因为 ji 是通过 tou - tu 算出来的,所以 tu + ji 一定等于 tou,条件二其实恒成立。但代码中仍然写上了这个判断,属于“双重保险”,逻辑上更严谨,也方便以后改成其他枚举方式。

【第 6 步】输出结果

如果两个条件都满足,就输出兔的数量 tu 和鸡的数量 ji,用空格隔开,然后换行。

由于本题只有一组解,所以只会输出一行。

【第 7 步】循环结束

当 tu 超过 35 后,循环结束。如果之前找到了答案,已经输出了;如果没找到,就什么也不输出(本题保证有解)。

 

 

#include<bits/stdc++.h>              // 万能头文件
using namespace std;
int jiao = 94, tou = 35;              // 全局变量:脚的总数、头的总数
int main(){
    for(int tu = 0; tu <= 35; tu++){  // 枚举兔的数量,从 0 到 35
        int ji = tou - tu;            // 鸡的数量 = 头的总数 - 兔的数量
        if(tu * 4 + ji * 2 == jiao && tu + ji == tou){  // 验证脚数和头数是否都符合
            cout << tu << ' ' << ji << endl;            // 输出兔的数量和鸡的数量
        }
    }
    return 0;
}

 

posted @ 2026-09-17 16:55  乐意丘  阅读(6)  评论(0)    收藏  举报