求解鸡兔同笼。在如下 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++) { // L1
ji_tou = tou - tu_tou;
if (tu_tou * 4 + ji_tou * 2 == jiao) {printf("兔的数量=%d,鸡的数量=%d\n", tu_tou, ji_tou);
break;
}
}
if (tu_tou == tou) // L2printf("无解\n");
看到代码先圈循环范围tu_tou< tou+1,明白tu_tou会取到tou。然后看if条件,找到解就break,tu_tou保持为解对应的值。最后if (tu_tou==tou)是想判断"没找到解",但break后tu_tou可能等于tou,导致误判。逐项分析选项:A看似能解,但tou=0时循环范围错误,且双重输出;B加初始化不影响循环逻辑;C缩小范围到tou会漏掉tu_tou=tou的解,比如全兔情况;D把if改成==tou+1,只有循环跑完且没找到解时才进入,避免双重输出,所以能正确求解。
A项忽略循环内break后tu_tou可能等于tou,导致双重输出;B项以为初始化是问题,其实循环内会赋值;C项认为循环范围应该到tou,但tu_tou=tou是合法解(全兔);D项改if条件后无解不输出,但命题人认为改后能避免双重输出。
本题考查GESP一级算法模块的循环控制与逻辑判断。命题人卡住考生对循环边界和if逻辑的直觉——很多考生凭经验认为"最后判断tu_tou==tou"就能判断无解,却忽略循环内break后的变量状态。
看到代码先圈出循环范围tu_tou< tou+1,明白tu_tou会取到tou(因为< tou+1等价于≤ tou)。然后看if条件,找到解就break,tu_tou保持为解对应的值。最后if (tu_tou==tou)是想判断"没找到解",但break后tu_tou可能等于tou(全兔解),导致误判。逐项分析选项:A看似能解,但tou=0时循环范围错误,且双重输出;B加初始化不影响循环逻辑;C缩小范围到tou会漏掉tu_tou=tou的解,比如全兔情况;D把if改成==tou+1,只有循环跑完且没找到解时才进入,避免双重输出,所以能正确求解。