GESP 二级 · GESP 202509 C++ 二级 第 12 题

选择题 · 答案 C

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

题目

下面 C++ 代码执行后输出与 5 有关数的数量。“与 5 有关的数”定义为含有 5 或者能被 5 整除的数。相关说法正确的是( )。

cnt = 0;
for (i = 1; i < 1000; i++){
    if (i % 5 == 0){
        cnt += 1;
        continue;
    }

    j = i;
    while (j > 0)
        if (j % 10 == 5){
            cnt += 1;
            break;
        }
        else
            j /= 10;
}
cout << cnt;
答案:C

解题思维

答案C。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。

常见错误

整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。

详细解析(节选)

【考点】continue 语句|while 循环|数字提取

考纲定位 本题考查 GESP 二级《循环结构与控制流》模块中 continue/break 的精细语义差异,命题人专卡学生"知道跳出循环但分不清条件"的盲区。

解题思维 代码逻辑分两层计数:i%5==0 时直接计数并 continue 跳过后续判断,避免重复统计;否则进入 while 逐位检查,找到含 5 即 break 终止。关键观察在于 break 与 continue 的语义差异——前者跳出循环,后者仅跳过本次迭代,所以 continue 的存在是为了防止 5 的倍数被重复计入。

陷阱拆解 A 删 continue 会让"能被 5 整除且含 5"的数(如 5,15)被计两次——既触发 if(i%5==0) 又进入 while 找到 5;B 删 j=i 改 j 为 i 会污染外层循环变量,导致重复计数或死循环;C 改 break 为 j=0 本质相同,因为 while(j>0) 遇到 j=0 立即结束;D 改 j>=0 是经典陷阱,当 j=0 时条件仍成立,j/=10 无变化,形成死循环。

反命题思维 若把 continue 改为 break,则 i%5==0 时也会进入 while 检查,导致所有 5 的倍数都被计入两次(含 5 的倍数和不含 5 的倍数);若把 break 改为 continue,则找到 5 后还会继续检查其余位,虽不影响结果但效率降低。下次刷到类似题,先问自己"命题人想考我什么"。

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