以下程序模拟了一个简单的小球反弹过程,横线处应该填入的是( )
#include <iostream>
using namespace std;
int main() {
int height = 10;
int distance = 0;
for (int i = 1; i <= 5; i++) { // 模拟5次落地
________________
height /= 2;
distance += height;
}
cout << distance << endl;
return 0;
}答案B。位运算代码补全要注意区分位运算符(&|^)和逻辑运算符(&&||)。异或(^)常用于交换值。
位运算代码补全容易出错,因为位运算结果不如算术运算直观。记住异或的自反性。
【考点】循环控制|整数除法|累加计数
1. 🎯 考纲定位 本题考查 GESP 三级大纲中"循环结构"与"简单数学模拟"的交叉考点。命题人专门设置这道题,就是为了卡住那些"以为看懂逻辑但不会写代码"的考生——你懂物理,但不懂 height /= 2 在整数运算中的行为。
2. 🧠 解题思维 看到题先想:程序模拟小球每次落地后反弹高度减半,distance 要累加的是落地瞬间的高度(即 height /= 2 后的值)。每次循环里,distance += height 正好完成累加,height /= 2 完成减半。循环 5 次,最终输出就是 5 次落地高度之和。
3. 🪤 陷阱拆解
distance += height/2;):这是最阴险的。你以为"反弹高度是原来的一半",但整数除法 height/2 在 height 为奇数时会产生截断误差(如 9/2=4),而题目中初始高度为 10 虽然避开了,但命题人就是想考你"懂不懂整数除法"。distance += height*2;):偷换概念。height 是落地高度,不是反弹高度,乘以 2 毫无依据。distance += height+1;):凭空加 1,没有任何物理或数学依据。4. 🔄 反命题思维 命题人视角:我把初始高度改成 100,反弹高度变成 50、25、12、6、3,你还能选对吗?这题本质上考的是"整数除法截断"和"累加时机"。刷到类似题,先问自己:变量更新顺序是什么?是先用旧值还是新值?