该段程序将 $ n $ 不停地除以 2,并输出此时的商和余数,直到 $ n = 0 $ 为止。
long long n;
cin >> n;
while(n != 0) {
cout << n/2 << ' ' << n%2 << '\n';
n /= 2;
}答案A。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】while循环|long long类型
GESP三级明确要求掌握while循环与长整型处理,本程序将while循环用于逐次除以2,考察学生是否理解循环条件与变量更新的完整流程。命题人特意设置long long类型,就是防止考生用int处理大数时发生溢出,这是三级试卷里最常见的数据陷阱。
看到n/=2立刻想到二进制转换——不断除以2取余是十进制转二进制的经典算法。本题的关键在于while(n!=0)的终止条件,只要n最终能归零,循环就必然结束;而n/=2的更新语句必须放在输出之后,否则第一次输出的是n本身而非n/2。这类题的通法是:先确认循环条件能否覆盖所有情况,再检查变量更新是否影响下一轮计算。
陷阱全在细节处:若把while改作do-while会多执行一次;若输出顺序调成n%2在前则结果错位;最阴险的是长整型——输入10^18时int会溢出,但题目没给范围,考生若盲目用int就会踩坑。命题人借这道题专门检验"看到数字大就想到long long"的条件反射,只背结论不看类型的人必栽跟头。
反命题思路:若把n/=2改成n/=3,程序会进入死循环(3无法整除2);若把条件改成n>0,负数输入会跳过循环却仍输出。这类题改条件就变味,提醒刷到类似题先问"命题人想卡我什么",答案往往藏在循环条件或数据类型里。