下面 C++ 代码用于输出 $N$ 和 $M$ 之间(可以包括 $N$ 和 $M$)的孪生素数。孪生素数是指间隔为 $2$ 的两个数均为素数,如 $11$ 和 $13$ 分别是素数,且间隔为 $2$。isPrime(N) 用于判断 $N$ 是否为素数的函数。为完成上述功能,横线处应填上的代码是( )。
int N, M;
// 本题假设 N 小于 M
cin >> N >> M;
for (int i = N; i < __________; i++)
if (isPrime(i) && isPrime(i + 2))
printf("%d %d\n", i, i + 2);答案B。循环补全要分析循环变量的初始值、条件和更新方式,确保能产生目标输出。
代入法验证时注意选项之间的细微差别。循环条件中的<和<=可能导致完全不同的结果。
【考点】循环边界控制|素数判断逻辑
解题思路必须紧扣题目要求的区间范围。孪生素数对 (i, i+2) 中的 i+2 必须落在 [N, M] 内,即 i+2 ≤ M,等价于 i ≤ M-2。for 循环的终止条件是 i < 某值,若填 M-2,循环会在 i=M-3 时停止,漏掉 i=M-2 这一对(此时 i+2=M,仍在范围内)。只有填 M-1,循环条件 i < M-1 才会在 i=M-1 时停止,保证 i+2 ≤ M 的所有 i 都被遍历到。
命题人设下的经典陷阱在于对"区间包含"的理解偏差。选项 A 看似更紧,实则漏掉边界;选项 C 和 D 会让 i+2 超出 M,却因循环条件宽松而多输出。很多考生只盯着"i 要小于 M",却忽略了 i+2 这个"隐式变量"的取值范围,这是二级 C++ 最常见的坑。
反命题视角:若题目要求输出 (i, i+2) 且 i+2 也在 [N, M] 内,循环条件应改为 i < M-1;若要求 i 和 i+2 都在 [N, M] 内,则需 i < M-1;若要求输出所有孪生素数对,其中 i+2 也在 [N, M] 内,循环条件应改为 i < M-1。
一句话提醒:遇到循环边界题,先画出变量取值范围,再对照终止条件,别被"看起来合理"的选项带偏。