GESP 二级 · GESP202609 C++ 二级 第 10 题

选择题 · 答案 D · 考点:循环控制、函数

← 整套速查表 GESP 二级 全部真题

题目

有关如下 C++ 代码描述,变量都是整型,错误的是(  )。

int n, limit, i;

cout << "请输入一个正整数: ";

cin >> n;
if (n <= 1)

printf("%d非素数", n);

else if (n == 2)

printf("2是素数");

else {
limit = sqrt(n) + 1;
for (i = 2; i < limit; i++)
if (n % i == 0) {

printf("%d非素数", n);

break;
}
if (i >= limit)

printf("%d是素数", n);

}
答案:D

考点

循环控制函数

解题思维

素数判定核心是"试除法":只需检查到√n即可。代码先排除n≤1(非素数),再单独处理n=2(最小素数)。else分支从2循环到√n+1,一旦发现整除立即break跳出循环。break后通过判断循环变量i是否到达limit来区分"找到因数"(非素数)与"未找到因数"(素数)。这是一个典型的"内层break控制流+外层状态判断"结构。

常见错误

A正确——n=1时sqrt(1)+1=2,循环不执行,i=0<2,误判为素数,必须显式排除。B错误——n=2时sqrt(2)≈1.41,limit=2.41,循环i=2不满足i<limit,直接输出"2是素数",看似正确,但题目说"省略后无区别",实际n=2会被漏掉,必须保留。C正确——n=4时i=2整除,不break会继续执行到i=3,再判断i>=limit输出"4是素数",明显错误。D错误——limit=√n+1是确保检查到√n的整数部分,改为2则对n=4会漏判,改为3则对n=5(√5≈2.2)会多检查i=3,但5%3≠0,结果正确,不过题目说"不会有错误",这属于偷换概念——某些情况会出错。

详细解析(节选)

素数判定核心是"试除法":只需检查到√n即可。代码先排除n≤1(非素数),再单独处理n=2(最小素数)。else分支从2循环到√n+1,一旦发现整除立即break跳出循环。break后通过判断循环变量i是否到达limit来区分"找到因数"(非素数)与"未找到因数"(素数)。这是一个典型的"内层break控制流+外层状态判断"结构。

A正确——n=1时sqrt(1)+1=2,循环不执行,i=0<2,误判为素数,必须显式排除。B错误——n=2时sqrt(2)≈1.41,limit=2.41,循环i=2不满足i<limit,直接输出"2是素数",看似正确,但题目说"省略后无区别",实际n=2会被漏掉,必须保留。C正确——n=4时i=2整除,不break会继续执行到i=3,再判断i>=limit输出"4是素数",明显错误。D错误——limit=√n+1是确保检查到√n的整数部分,改为2则对n=4会漏判,改为3则对n=5(√5≈2.2)会多检查i=3,但5%3≠0,结果正确,不过题目说"不会有错误",这属于偷换概念——某些情况会出错。

1. 考纲定位

本题考查内容位于GESP二级(基础编程)大纲的核心模块:循环结构与控制流、基本算法实现。命题人把这道题放在二级卷中,是卡住"会写循环但不懂循环控制流"的薄弱点——大量考生能写出for循环框架,却对break如何影响后续判断缺乏直观理解。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断