题解
你站我就坐
1 条题解
-
0
解题思路
这道题就像是老师点名:
有 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