top1编程
← 返回题目
题解

你站我就坐

1 条题解

  • 0
    @ 2026-8-5 1:08:04

    解题思路

    这道题就像是老师点名:

    有 n 个小朋友站成一排,老师说"编号是 k 的倍数的同学请坐下"。

    那么我们要做的,就是逐个检查每个小朋友的编号,看看这个编号是不是 k 的倍数。

    怎么判断"是不是倍数"呢?用取模运算 %:

    • 如果 i % k == 0,说明 i 能被 k 整除,这个小朋友要坐下。
    • 如果 i % k != 0,说明不能整除,这个小朋友还站着,我们要把他输出。

    比如 n=7,k=3:编号 3 和 6 是 3 的倍数,他们坐下;剩下的 1、2、4、5、7 站着,输出 1 2 4 5 7。

    还有一个小技巧:控制空格。我们用一个 first 变量记住"是不是要输出的第一个数",只有第一个数前面不加空格,其他的数前面都加一个空格。这样输出就不会有多余的空格或者开头空一格啦。

    参考代码

    // P4471 你站我就坐:编号是k的倍数的人坐下,其余站着,按顺序输出站着的人
    #include <iostream>
    using namespace std;
    int main() {
        int n, k;
        cin >> n >> k;
        int first = 1;  // 标记是否是输出的第一个数(用于控制空格)
        for (int i = 1; i <= n; i++) {
            if (i % k != 0) {      // 编号不是k的倍数:这个人还站着
                if (!first) cout << ' ';  // 不是第一个数,前面加空格
                cout << i;
                first = 0;               // 输出过一个数了,标记改成0
            }
        }
        cout << endl;
        return 0;
    }
    

    复杂度分析

    • 时间:从1到n每个编号都检查一遍,所以是 O(n)。
    • 空间:只用几个简单的变量,是 O(1)。
    • 1