求解鸡兔同笼。在如下 C++ 代码中,tou 代表鸡和兔的头总数,jiao 代表鸡和兔的脚总数。先后两个输 入均为正整数。该程序能求解鸡兔同笼。
int tou, jiao, tu_tou, ji_tou;cout << "请输入鸡和兔的头总数:";
cin >> tou;cout << "请输入鸡和兔的脚总数:";
cin >> jiao;
for (tu_tou = 0; tu_tou < tou + 1; tu_tou++) {
ji_tou = tou - tu_tou;
if (tu_tou * 4 + ji_tou * 2 == jiao)printf("兔的数量=%d,鸡的数量=%d\n", tu_tou, ji_tou);
}
if (tu_tou == tou)printf("无解\n");
这题考查暴力枚举法解不定方程。看到题先想:鸡兔同笼本质是 2x+4y=jiao 且 x+y=tou 的二元一次方程组,但 GESP 二级不要求解方程,而是用循环穷举兔的数量 tu_tou 从 0 到 tou,算出鸡的数量 ji_tou=tou-tu_tou,验证脚数是否匹配。关键观察:循环结束后 tu_tou 必然等于 tou,所以不能直接用 tu_tou==tou 判断无解,必须引入布尔标志位记录是否找到过解,否则解找到后循环继续跑完,最后仍会误判。
A 选项看似正确,实则忽略了循环结束后 tu_tou 恒等于 tou 的事实。B 选项才是命题人设的陷阱,利用考生"循环跑完就代表没找到解"的直觉错误,把无解判断放在循环外,导致有解时也会输出"无解"。最阴险的细节在于:代码前半段逻辑完全正确,只有最后一行 if 语句破坏了整体正确性,这种"局部正确、整体错误"的陷阱比纯语法错误更难察觉。
这题考查暴力枚举法解不定方程。看到题先想:鸡兔同笼本质是 2x+4y=jiao 且 x+y=tou 的二元一次方程组,但 GESP 二级不要求解方程,而是用循环穷举兔的数量 tu_tou 从 0 到 tou,算出鸡的数量 ji_tou=tou-tu_tou,验证脚数是否匹配。关键观察:循环结束后 tu_tou 必然等于 tou,所以不能直接用 tu_tou==tou 判断无解,必须引入布尔标志位记录是否找到过解,否则解找到后循环继续跑完,最后仍会误判。
A 选项看似正确,实则忽略了循环结束后 tu_tou 恒等于 tou 的事实。B 选项才是命题人设的陷阱,利用考生"循环跑完就代表没找到解"的直觉错误,把无解判断放在循环外,导致有解时也会输出"无解"。最阴险的细节在于:代码前半段逻辑完全正确,只有最后一行 if 语句破坏了整体正确性,这种"局部正确、整体错误"的陷阱比纯语法错误更难察觉。
本题落在 GESP 二级《循环结构》模块,同时涉及《条件判断》。命题人放这道题,就是要卡住"循环结束后如何判断是否找到解"这个弱点——绝大多数考生会凭直觉认为"循环跑完就是没找到",却忽略了 tu_tou 在循环结束时必然等于 tou 这一事实。
这题本质是暴力枚举:兔的数量 tu_tou 从 0 到 tou 遍历,鸡的数量 ji_tou=tou-tu_tou 随之确定,验证 tu_tou*4+ji_tou*2 是否等于 jiao。正确做法必须引入状态标志:
bool found = false;
for (tu_tou = 0; tu_tou <= tou; tu_tou++) {
ji_tou = tou - tu_tou;
if (tu_tou * 4 + ji_tou * 2 == jiao) {
printf("兔的数量=%d,鸡的数量=%d\n", tu_tou, ji_tou);
found = true;
}
}
if (!found) printf("无解\n");这样无论找到几个解,都不会误判。通法:凡是"循环结束后判断是否找到过解"的场景,必须用布尔标志位,不能依赖循环变量。
站在命题人视角,这道题的变体可以很丰富:
这些变体都指向同一个核心:循环结束后 tu_tou 的值与是否找到解无关,必须用标志位记录。命题人正是利用这个"循环变量与解的存在性无关"的直觉错误,设计了这道题。