(百鸡百钱)我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
#include<iostream>
using namespace std;
int main() {
for (int x = 0; ①; ++x) {
for (int y = 0; ②; ++y) {
for (int z = 0; ③; ④) {
if (x + y + z == 100 && ⑤) {
cout << x << " " << y << " " << z << endl;
}
}
}
}
return 0;
}
1. ① 处应该填( ) A. x <= 5 B. x <= 20 C. x <= 15 D. x <= 10 2. ② 处应该填( ) A. y <= 10 B. y <= 15 C. y <= 20 D. y <= 33 3. ③ 处应该填( ) A. z <= 100 B. z <= 200 C. z <= 300 D. z <= 50 4. ④ 处应该填( ) A. z++ B. ++z C. z += 3 D. z *= 3 5. ⑤ 处应该填( ) A. 5x + 3y + 3z == 100 B. 5 * x + 3 * y + 3 * z == 100 C. 5 * x + 3 * y + z / 3 == 100 D. x + y + z == 100
别硬套暴力枚举,先抓住‘3只雏鸡1钱’这个核心:把z按3的倍数走,再用100-x-y=z反推雏鸡数,最后验算总价。这样三层循环能砍掉90%无效枚举,直接定位答案。
很多学生第一反应是每只雏鸡3钱,把⑤写成5x+3y+3z=100,或者把z的步长写成z++,导致算出来的钱数远超100。还有的同学只盯着层数上限,把x、y、z的边界都设成100,跑起来慢到超时,却忘了题目里‘3只1钱’的隐含约束。记住:雏鸡是3的倍数,且钱数是整数,这是解题的硬门槛。
这道题考的是经典‘百鸡百钱’问题,核心知识点是枚举优化与整数方程求解。命题人喜欢挖坑的地方就在三个地方:一是雏鸡按‘3只1钱’计价,二是循环层数要尽可能小,三是判断条件里雏鸡数必须能被3整除。很多学生一看到三层for循环就慌,直接填x<=100、y<=100、z<=100,结果不仅慢,还因为漏掉雏鸡的倍数约束,最后算出的总价根本不对。
拿到题先想什么?先想‘雏鸡怎么算钱’。题目说‘鸡雏三值钱一’,意味着每只雏鸡价值1/3钱,但钱必须是整数,所以雏鸡总数z一定是3的倍数。这一点直接决定了③处的步长和⑤处的判断条件。如果z不是3的倍数,哪怕x+y+z=100,总价也一定是小数,不可能等于100。
接下来看循环层数。外层是公鸡x,公鸡单价5钱,100钱最多买20只,所以x的上限是20。如果填x<=10,那最多只能买10只公鸡,剩下的90钱要全买母鸡和雏鸡,但母鸡单价3钱,90钱最多买30只母鸡,雏鸡再买30只(10钱),总数才60只,达不到100只。因此①处必须填x<=20,选项B正确。
中层是母鸡y,母鸡单价3钱。x最大20时,剩下80钱,80/3≈26.6,所以y最多26只;但x最小时(0只),100钱全买母鸡,100/3≈33.3,所以y最多33只。因此②处必须填y<=33,选项D正确。
内层是雏鸡z,因为z必须是3的倍数,且x+y+z=100,所以z最大也就是100(当x=y=0时),但100不是3的倍数,实际能取到的最大z是99(99=3×33)。不过为了保险起见,循环条件可以放宽到z<=300(选项C),这样不会漏解,只是多跑几轮而已。关键是④处的步长:既然z必须是3的倍数,每次增加3,所以填z+=3,选项C正确。
最后看判断条件⑤。总价=5x+3y+z/3。注意这里z/3是整数除法,因为z一定是3的倍数,所以结果就是整数钱数。很多同学会误写成5x+3y+3z=100,这是把雏鸡单价当成3钱,完全反了;或者写成x+y+z=100,这只保证了只数,没保证钱数。正确写法是5*x+3*y+z/3==100,选项C正确。
避坑指南:第一,千万别把雏鸡单价记成3钱,那是鸡母的价格;第二,循环层数别贪小,x<=10这种明显不行的选项要果断排除;第三,判断条件里一定要用z/3,不能用3z;第四,z的步长一定要是+=3,否则枚举会漏掉所有合法解。这些坑在考试里非常隐蔽,但一旦踩中,分数就没了。
考频与趋势:回顾近年CSP-J/S真题,‘百鸡百钱’这类枚举优化题在2021、2022、2023年各出现过一次,通常作为第20题或第21题出现,属于高频考点。2024年BCSP-X第20题再次回归,说明命题人仍喜欢用经典问题考察学生对整数约束和循环优化的掌握。未来两年(2025-2026)大概率还会以类似形式出现,要么换数字(比如‘百钱买百羊’),要么增加一层约束(比如‘公鸡比母鸡多’),但核心思路不变:先抓住整数倍数,再优化循环层数,最后用精确方程验证。
综上,这道题的正确答案依次是:①B、②D、③C、④C、⑤C。解题的关键在于理解‘3只雏鸡1钱’这一隐含约束,并用它来缩小枚举范围、简化判断条件。