这是循环的做法,之后还会有其他的算法。
洛谷P1996 题目传送门
题目描述
n个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 11 开始报数,数到m的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。
注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰 n-1 名小朋友,而该题是全部出圈。
输入格式
输入两个整数 n,m。
输出格式
输出一行 n个整数,按顺序输出每个出圈人的编号。
输入输出样例
输入 #1复制
10 3
输出 #1复制
3 6 9 2 7 1 8 5 10 4
说明/提示
1≤m,n≤100
代码(详解):
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
int a[1003],n,m;//a定义每位童鞋
scanf("%d %d",&n,&m);//格式化输入
/*
cin>>n>>m; 简易输入
*/
for(int i=1;i<=n;i++){
a[i]=1;//让每位小朋友坐上圆桌,1表示没出局,0表示出局
}
int t=0,p=0,j=1;//p表示出局人数 ,t表示报的数 ,j为序号
while(p<n){//当p==n时,全部被淘汰,跳出循环,结束程序
if(a[j]==1){
t++;//如果没出局,那他有资格报数
}
if(t==m){//当报的数和要求的数一样时,这位小童鞋出局
cout<<j<<" ";//输出这位出局的童鞋
a[j]=0;//失去报数资格
t=0;//重新报数
p++;//出局人数+1
}
j++;//下一位童鞋~~~
if(j==n+1){
j=1;//处理圆环
}
}
return 0;//华丽的结束
}