问题描述:
n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
1≤m,n≤100
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n−1 名小朋友,而该题是全部出圈。
输入:
输入两个整数 n m
输出:
输出一行 n 个整数,按顺序输出每个出圈人的编号。
样例输入:
10 3
样例输出:
3 6 9 2 7 1 8 5 10 4
参考代码:
#include<iostream>
using namespace std;
int a[100]={0};
//元素值为0表示未出局
//i既代表数组的下标,也代表每个人的编号
//k是用来计数的,一旦k的值达到m,代表此人需要出局,并且k需要重新计数,这样才能够找出所有需要出局的人
//数组的0代表未出局的人,数组非0代表出局的人,未出局的人需要报数,出局的人不需要报数
int main()
{
int m,n,i=1,sum=0,k=0;//sum是出局人数
cin>>n>>m;
while(n!=sum)//当出局人数!=n 进入
{
if(i>n)//当i>n的时候从1重新报数
i=1;
if(a[i]==0)//只有当元素值为0进入 否则直接++
{
k++;//k计数器++
if(k==m)
{
sum++;
k=0;//k从0开始报数
a[i]=1;//元素值变1 表示出局 往后不再报数
cout<<i<<" ";
}
}
i++;
}
return 0;
}