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 枚举法的通用套路
枚举法通常包含三个步骤:
-
确定枚举范围:本题中兔的数量从 0 到 35。
-
确定验证条件:脚数等于 94,头数等于 35。
-
遍历所有可能:用循环逐一检查,满足条件就输出。
三、程序执行流程逐步解析
下面按照程序实际执行的顺序,逐步讲解每一步在做什么。所有代码片段在文末统一给出,这里只讲逻辑。
【第 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; }

浙公网安备 33010602011771号