🔍 一、题目解析:鸡兔同笼
✅ 题目内容
笼中有若干只鸡和兔子。
每只鸡有 1个头、2只脚;
每只兔子有 1个头、4只脚;
已知总共有 $ x $ 个头,$ y $ 只脚。
问:鸡有多少只?兔子有多少只?
数据保证有解。
📥 输入描述
输入共一行,两个整数 x, y(表示头数和脚数)
📤 输出描述
输出两行:
第一行为鸡的数量
第二行为兔子的数量
🧪 样例输入与输出
输入:40 100
输出:
30
10
解释:
总共40个头 → 鸡 + 兔 = 40
总共100只脚 → 2×鸡 + 4×兔 = 100
设鸡为 $ c $,兔为 $ r $
联立方程组:
\begin{cases} c + r = 40 \ 2c + 4r = 100 \end{cases} \Rightarrow \begin{cases} c = 30 \ r = 10 \end{cases}
{
c+r=40
2c+4r=100
⇒{
c=30
r=10
⚙️ 二、数学建模与通解推导
我们来建立通用公式:
设:
$ x :头总数(即动物总数):头总数(即动物总数) :头总数(即动物总数) y $:脚总数
令:
$ c :鸡的数量:鸡的数量 :鸡的数量 r $:兔子的数量
则:
\begin{cases} c + r = x & \text{(1)}\ 2c + 4r = y & \text{(2)} \end{cases}
{
c+r=x
2c+4r=y
(1)
(2)
将 (1) 代入 (2) 化简:
由(1)得 $ c = x - r $,代入(2):
2(x - r) + 4r = y \Rightarrow 2x + 2r = y \Rightarrow r = \frac{y - 2x}{2}
2(x−r)+4r=y⇒2x+2r=y⇒r=
2
y−2x
所以:
兔子数量:$ r = \frac{y - 2x}{2} 鸡的数量: 鸡的数量:鸡的数量: c = x - r = x - \frac{y - 2x}{2} = \frac{4x - y}{2} $
或者也可以先算鸡再算兔(如你所做),但我们必须确保逻辑清晰且无误。
🧑💻 三、分析你的代码
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b; // a 是头数x,b是脚数y
a = 4; // a 变成 4x
c = (a - b) / 2; // c = (4x - y)/2 → 这其实是鸡的数量!
cout << c << endl;
cout << (b - c * 2) / 4; // 剩余脚除以4 → 兔子数
}
✅ 正确性验证(用样例测试)
输入:x=40, y=100
步骤:
a = 40, b = 100
a = 4 → a = 160
c = (160 - 100)/2 = 60/2 = 30 → 鸡 = 30 ✔️
(b - c2)/4 = (100 - 60)/4 = 40/4 = 10 → 兔 = 10 ✔️
✅ 输出:
30
10
结果是对的!
❌ 存在的问题(虽能AC样例,但不够稳健)
1. 变量命名混乱
a, b, c 没有意义,不利于阅读和调试。
尤其是把 x 改成了 4x 后继续叫 a,容易出错。
2. 修改了原始输入值
修改了 a(原为头数)变成 4*a,破坏了原始数据。
虽然不影响当前计算,但在复杂问题中会引发严重 bug。
3. 没有考虑整除性和合法性判断
虽然题目说“数据保证有解”,但作为良好编程习惯,至少应理解何时会出现非法情况(比如奇数脚、负数等)。虽然本题可省略检查,但思路要清楚。
4. 第二个输出表达式冗余复杂
你用了 (b - c*2)/4 来求兔子数量,其实可以直接用:
x - c
因为总数已知!
这才是最优方式!
✅ 四、推荐的标准解法(信奥推荐写法)
#include <iostream>
using namespace std;
int main() {
int x, y;
cin >> x >> y; // x: 头数, y: 脚数
}
✅ 或者更简洁地:
#include <iostream>
using namespace std;
int main() {
int x, y;
cin >> x >> y;
}
👉 推荐这个版本:清晰、高效、易读
💡 五、为什么这个更优?
维度 你的原代码 推荐代码
可读性 差(变量名抽象) 好(见名知意)
安全性 中(改写了输入) 高(保留原始数据)
效率 相当 相当
扩展性 差 好(便于添加检查)
符合信奥规范 否 ✅ 是
🛠 六、进阶建议(信奥知识拓展)
即使题目说“数据保证有解”,我们也应该了解什么情况下无解:
以下任一成立则无解:
$ y $ 是奇数 → 不可能(每只动物脚都是偶数)
$ y < 2x $ → 全是鸡也不够脚
$ y > 4x $ → 全是兔还多出脚
$ (y - 2x) % 2 != 0 $ → 兔子数不是整数
例如:x=5, y=13 → $ r=(13-10)/2=1.5 $ → 非整数 → 无解
但由于本题明确说明:“数据保证有解”,这些判断可以不写。
不过,在更高阶比赛中(如NOIP),这类边界条件常常需要自己判断!
✅ 七、总结:有没有更优解?
✅ 结论:有更优解 —— 更清晰、安全、规范的写法
✔️ 更优体现在:
使用有意义的变量名(如 x, y, chicken, rabbit)
不修改原始输入
利用总数关系简化计算(兔 = 总数 - 鸡)
符合信息学竞赛编码风格(简洁+正确+高效)
✅ 最终推荐代码(信奥标准答案模板)
#include <iostream>
using namespace std;
int main() {
int x, y;
cin >> x >> y;
int chicken = (4 * x - y) / 2;
int rabbit = x - chicken;
cout << chicken << '\n' << rabbit << endl;
return 0;
}
🎯 时间复杂度:O(1)
🎯 空间复杂度:O(1)
🎯 完美通过所有合法数据(包括样例)
🎓 给你的学习建议
命名要有意义:不要用 a,b,c,要用 x,y,chicken,rabbit
不要轻易修改输入变量
善用数学推导简化逻辑
养成结构化思维习惯:输入 → 计算 → 输出
提前思考边界情况,哪怕题目说“保证有解”
可以:
#include <iostream>
using namespace std;
int main() {
int a,b,c;
cin>>a>>b;
a*=4;
c=(a-b)/2;
cout<<c<<endl;
cout<<(b-c*2)/4;
}