NOIP 提高组初赛 · NOIP 2016 提高组初赛试题 第 10 题

选择题 · 答案 D · 考点:函数定义与调用

← 整套速查表 NOIP 提高组初赛 全部真题

题目

有以下程序:

#include <iostream>
using namespace std;
int main()
{
    int k = 4, n = 0;
    while (n < k)
    {
        n++;
        if (n % 3 != 0)
            continue;
        k--;
    }
    cout << k << "," << n << endl;
    return 0;
}

程序运行后的输出结果是( )。

答案:D

考点

函数定义与调用

解题思维

别急着套公式,这题核心就是死磕 while 循环里 continue 的跳转时机。n 自增后先判断能不能整除 3,不能整除直接跳过后续代码;只有整除时 k 才会减一。抓住这个逻辑,一步步模拟 n=1,2,3 的变化,答案自然浮现。

常见错误

很多同学会忽略 continue 的作用,以为 n=3 时 k 减一后,循环条件 n<k 不成立就立刻结束,忘了 n 是在循环开头先自增的。还有人会把 continue 当成 break,以为 n=3 时直接跳出整个循环,导致 k 没减或者 n 没变。更隐蔽的错误是认为 n 从 1 加到 4 过程中 k 会一直减,其实只有 n 是 3 的倍数才减,所以 k 只减了一次。记住:continue 只是跳过本次循环剩余语句,不退出循环,下轮 n 还会继续加。

详细解析(节选)

考点概念:循环与 continue

这题考的是最基础的 while 循环流程控制,特别是 continue 语句的跳转行为。很多人对 continue 的理解停留在“跳过本次循环剩余代码”,但具体怎么跳、什么时候跳、跳了之后循环变量怎么变,才是命题人最爱挖坑的地方。

命题视角:为什么考这个?

命题人故意把 n%3==0 放在 n 自增之后,又紧跟一个 continue,就是为了制造“看起来应该执行 k--,实际却被跳过”的错觉。同时,循环条件 n<k 在 n 达到 3 时立刻变成假,让学生误以为循环会在 n=3 时提前结束,从而忽略 k 的递减。这种“条件判断 + 分支跳转 + 循环终止”的组合,是信息学初赛里高频出现的陷阱模型。

同考点真题

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