输入一个正整数 $N$,想找出它所有相邻的因数对,比如,输入 $12$,因数对有 $(1,2)$、$(2,3)$、$(3,4)$。下面哪段代码找不到所有的因数对?( )
这道题本质是考循环边界的敏感度。拿到题先想:相邻因数对 (a, a+1) 里 a 最小能取几?代入 N=12 试试,(1,2) 是合法的对子,但选项 B 的循环从 i=2 开始,直接就把这个最基础的解给漏掉了。
学生最容易掉进的坑是思维定势——看到‘相邻因数’就默认从 2 开始枚举,或者觉得 1 和 2 太简单不用管。其实命题人专门用 (1,2) 这种边界情况来卡人。另外,做这类题千万别光看代码里 i 从几开始,得结合题目要求的具体输出内容去验证,比如算一下 N=12 时应该输出几对,再对照代码实际能跑出来几对,这样就能一眼看出 B 选项少输了一对。
【考点】枚举法|因数判定|循环边界控制
命题视角:GESP 二级《循环与判断》模块的经典题型。命题人特意构造了‘相邻因数对’这一特殊场景,利用 (1,2) 这一看似平凡实则关键的边界条件来考察考生对循环起始值的敏感度。很多人习惯性地认为因数枚举从 2 开始,或者觉得 1 和 2 是 trivial 的,从而在写循环时直接跳过了 i=1 的情况。
解题心法:拿到题,第一步不是看代码,而是把题目要求具象化。以 N=12 为例,因数对有 (1,2)、(2,3)、(3,4)。我们要找的是所有满足 a|N 且 (a+1)|N 的整数 a。既然 a 可以取 1,那么循环变量 i(代表 a)的起始值必须从 1 开始,绝不能从 2 开始。
逐项分析: A 选项:for(i=1;i<N;i++),i 从 1 遍历到 N-1,直接判定 i 和 i+1 是否都整除 N。逻辑完整,能覆盖 (1,2) 到 (N-1, N),正确。 C 选项:for(i=2;i<N/2;i++),这里 i 代表的是较大的那个因数,对应的较小因数是 i-1。当 i=2 时,检查的是 (1,2);i 遍历到 N/2 时,检查的是 (N/2-1, N/2)。这种反向枚举巧妙地避开了重复,且起始值 i=2 对应的正是我们要找的 (1,2),正确。 D 选项:for(i=1;i<N/2;i++),i 代表较小的因数,直接检查 i 和 i+1。i 从 1 开始,自然包含 (1,2),且遍历到 N/2 足够覆盖所有相邻对(因为若两个相邻数都大于 N/2,它们的乘积必然大于 N,不可能同时是 N 的因数),正确。
避坑指南:B 选项 for(i=2;i<N;i++) 把 i 的起始值定为 2,这意味着它只会检查 (2,3)、(3,4)... 而完全忽略了 (1,2) 这一对。对于 N=12,正确答案应该输出三对,但 B 选项只能输出两对,这就是典型的‘漏解’。这类题的陷阱就在于:你以为枚举从 1 开始很麻烦,不如从 2 开始省事,结果恰恰是这一步之差。
考频与趋势:本题涉及的‘枚举法’考点在题库中已考过 159 题,覆盖 9 个级别。从逐年分布看,2023 年考了 5 题,2024 年 6 题,2025 年 6 题,2026 年 13 题,呈现明显的上升趋势,尤其是 2026 年激增到 13 题,说明命题组对枚举类题目的重视程度在加大。在分赛事维度,CSP 入门级独占 133 题,GESP 三级、四级、二级等也均有分布,说明该考点是入门到进阶的必经之路。
预测:基于 2026 年枚举题数量翻倍的趋势,未来考试可能会在枚举的基础上增加一层复杂度,例如‘相邻因数对的数量统计’或‘寻找最大相邻因数对’,不再仅仅考察边界条件的正确性,而是考察对枚举结果的进一步处理。因此,掌握循环边界只是第一步,后续对枚举数据的统计、极值判断等能力也需要同步加强。