下面 C++ 代码用于判断键盘输入的整数是否为质数。质数是只能被 1 和它本身整除的数。在横线处应填入代码是( )。
int N;
cin >> N;
int cnt = 0; // 记录N被整除的次数
for(int i=1; i<N+1; i++)
if(_____________)
cnt +=1;
if(cnt == 2)
cout << N << "是质数";
else
cout << N << "不是质数";这题本质是统计约数个数,横线要填‘整除条件’。把每个选项代入循环,看cnt何时加1,就能锁定答案。
很多同学误以为N%i就是整除判断,忘了条件判断必须返回布尔值;还有人把N/i==0当成整除条件,其实除数越大约数越少,这个条件几乎永远为假;更隐蔽的是把N%i直接当条件,非零即真,导致cnt乱加。
这道题考的是循环控制和取模运算的结合,属于GESP一级“循环控制”模块的必考项。命题人专卡“条件判断写错”的弱点——把取模表达式当条件用,或漏写等号,导致循环计数完全跑偏。
在C++里,判断一个数N能否被i整除,最直接的写法是N % i == 0。
N % i是取模(求余)运算,结果是一个整数。if条件里,C++会把非0整数当成“真”,0当成“假”。所以如果只写N % i,只要余数不为0,条件就为真,cnt就会莫名其妙地增加,这显然不是我们想要的“整除”逻辑。GESP一级刚接触循环,学生很容易把“表达式”和“条件”混淆。命题人故意把四个看起来都跟N、i有关的式子放在横线里,其中三个是非布尔值(A、C、D),只有B是标准的布尔表达式。而且B的写法N % i == 0恰好是“整除”的正确条件,其他选项要么逻辑错误,要么条件永远不成立。
1. 先读清题意:题目说“统计N被整除的次数”,也就是cnt要累加的次数等于N的约数个数。 2. 看循环结构:for(int i=1; i<N+1; i++) 会让i从1走到N,每一轮都要判断“i是否整除N”。 3. 代入验证:把每个选项放进横线,看cnt会怎么变。 - 若填A N%i,只要N%i≠0,条件就为真,cnt几乎每轮都+1,最后cnt≈N,显然不对。 - 若填C N/i==0,当i≤N时,N/i≥1,条件恒假,cnt=0,也不对。 - 若填D N/i,同A,非布尔且逻辑错误。 - 若填B N%i==0,只有当i是N的约数时条件为真,cnt恰好等于约数个数。 4. 结合输出:最后if(cnt==2)判断是否为质数。质数定义是“只能被1和它本身整除”,即约数个数恰好为2。B选项正好满足这个逻辑。
假设N=7(质数):
假设N=8(合数):
可见只有B能让cnt正确统计约数个数。
1. 漏写等号:把N%i当成条件,以为“有值”就是整除。实际上非零即真,cnt会狂增。 2. 误用除法:把N/i==0当成整除条件。除数越大,商越小,i≤N时商≥1,条件永远假,cnt=0。 3. 忽略布尔类型:C++的条件判断需要布尔值,非布尔表达式会被隐式转换,但逻辑已经错了,转换也救不了。 4. 范围理解偏差:循环是i<N+1,也就是i从1到N,包含N本身。如果误以为只到N-1,就会漏掉N这个约数,cnt少1,判断出错。
根据题库统计,运算符与表达式这一考点共考过261题,覆盖9个考试级别(2007-2026)。逐年分布:2007年4题、2008年1题、2009年4题、2010年5题、2014年1题、2019年3题、2020年2题、2021年1题、2022年1题、2023年91题、2024年41题、2025年61题、2026年14题、null年32题。分赛事来看,GESP一级考了72题,占比最高,其次是GESP二级70题、GESP三级47题等。
从数据可以看出,2023年该考点突然爆发(91题),2024年回落至41题,2025年又回升至61题,说明命题人对该考点的考察呈“波动式”高频状态,尤其在GESP一级中几乎年年出现。
基于上述数据与经验,可以合理预测:
while结构,或者把统计对象从“约数个数”换成“满足某条件的数个数”,但核心仍是考察“取模/除法条件”的正确写法。N%i==0这种布尔表达式的识别。总之,遇到循环统计类题,先问自己:“统计的是什么?”再代入每个选项看cnt的变化,就能稳稳抓住答案。这道题的正确答案就是 B. N % i == 0。