Description
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。
Input
输入两个整数n,m。
Output
输出一行 n 个整数,按顺序输出每个出圈人的编号。
Sample 1
Input | Output |
10 3 | 3 6 9 2 7 1 8 5 10 4 |
Hint
1≤m,n≤100
题目描述:
n个人围成圈1圈,从第一个人开始依次报数,数到m的人
出列(输出其原本在队伍中的位置)下一个人从1重新开始依次报
数,直至最后一个人输出其所在位置。输入两个整数n,m,n表示
共多少人,m表示数到第几个人出列,输出一行代表输出顺序。
解题思路:
可以采用01思想,首先用数组形式将每个人的初始位置记为1,
然后将需要出列的位置记为0,并输出此时的位置序号,然后整体采用
一个大循环,使其能进行重复的循环遍历(当查找到数组末尾时,需要
从头开始再次进行遍历数组)直到数组内各位置全为零结束。
错误描述:
刚开始并未想到有好的方法对查询到底部的数据进行往复处理;
解决方法:
在外部对其进行循环嵌套,使循环结束条件为数组内个数据全为0。
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a[105];
int n, m, i, sum = 0;
cin >> n >> m;
for (i = 0; i < n; i++) {
a[i] = 1;
}
int x = n;
while (1) {
for (i = 0; i < n; i++) {
sum += a[i];
if (sum == m) {
cout << i + 1 << " ";
a[i] = 0;
sum = 0;
x--;
}
}
if (x == 0)
break;
}
}