下面代码用于统计 $n$ 中因子 $2$ 出现了多少次。若 $n=40$,输出是( )。
int n = 40;
int cnt = 0;
while (n % 2 == 0) {
cnt++;
n /= 2;
}
cout << cnt;仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】二进制分解|循环结构|整除运算
1. 🎯 考纲定位 本题考查 GESP 五级算法模块"素数与分解"中的"因子分解"考点。命题人用极简循环卡住那些只会背"质因数分解公式"却不懂"二进制分解"本质的考生。
2. 🧠 解题思维 看到题先问"40 里有多少个 2?"——关键是"除尽":40→20→10→5,循环执行 3 次。这题本质是考"二进制分解":任何数 n 都能写成 n=2^k·m(m 为奇数),k 就是因子 2 出现的次数。通法:用 while(n%2==0){cnt++; n/=2;} 直接统计指数,这是处理"质因子幂次"问题的标准范式。
3. 🪤 陷阱拆解 选项 A(1)是"只看到 40 是偶数"的直觉陷阱;选项 B(2)是把"除尽次数"和"二进制位数"混淆;选项 D(4)更是离谱——把 40 写成 2^4·2.5,强行凑个 4。最阴险的是:题目故意没写"n 为奇数时停止",让你以为循环会无限执行,其实 n/=2 会让 n 最终变成奇数。
4. 🔄 反命题思维 若把条件改成 n % 3 == 0,答案变 0(40 不能被 3 整除);若把循环改成 while(n>1){cnt++;n/=2;},答案变 5(多算了奇数阶段)。刷到类似题先问:"命题人想考我'二进制分解'还是'普通循环'?"