一个小数是 $0.123123123\ldots$ 无限循环,其小数点后 $1$ 位是 $1$,后 $2$ 位是 $2$,依此类推,求第 $N$ 位的值。横线处应填入的代码是( )。
int N;
cin >> N;
remainder = ___________;
if (remainder == 0)
cout << 1;
else if (remainder == 1)
cout << 2;
else
cout << 3;答案B。循环补全要分析循环变量的初始值、条件和更新方式,确保能产生目标输出。
代入法验证时注意选项之间的细微差别。循环条件中的<和<=可能导致完全不同的结果。
【考点】循环结构中的数学映射|取余运算的应用|循环节周期计算
考纲定位:GESP 二级 C++ 卷中,这道题专门卡住"对循环周期理解不深"和"混淆 N 与 N-1 的起始位置"的弱点。命题人把循环节长度 3 藏在小题里,逼你用数学映射而不是死记结论。
解题思维:看到"无限循环小数"先想"循环节长度为 3"。关键观察:第 1 位的 N=1,1%3=1 却代表数字 1,所以直接用 N%3 会错位。推理:把 N 减 1 让余数 0 对应第 1 位,所以 remainder = (N-1) % 3。通法:任何循环节长度为 L 的问题,第 N 位的下标 = (N-1) % L,输出数字 = 下标 + 1。
陷阱拆解:A 选项 N % 3 利用"第 N 位直接取余"的直觉,但余数 0 应映射到数字 3,这里却输出 1,错位。C 选项 N / 3 完全错误,得到的是完整循环节个数而非位置偏移。D 选项 (N-1) / 3 给出的是位置索引(0,1,2),但题目要求数字(1,2,3),需要映射。最阴险的细节:代码里用 if-else 判断 remainder == 0,1,却输出 1,2,3,这意味着 remainder 0 必须对应数字 1,而 N%3=0 时 N 是 3 的倍数,对应数字 3,所以必须用 (N-1)%3 才能让 0 落在 1 上。
反命题思维:如果把循环节改成问"第 N 个完整循环节的长度",答案会变成 N/3;如果改成 0.123456... 则周期变为 6,答案变成 (N-1)%6。刷到类似题先问:命题人想考我"循环节长度"还是"起始偏移",还是"输出映射"。