猴子报数
兰州大学/湖南大学机试题
目录
题目描述
Time Limit: 1000 ms
Memory Limit: 256 mb
n个猴子围坐一圈并按照顺时针方向从1到n编号,从第s个猴子开始进行1到m的报数,报数到第m的猴子退出报数,从紧挨它的下一个猴子重新开始1到m的报数,如此进行下去知道所有的猴子都退出为止。求给出这n个猴子的退出的顺序表。
输入输出格式
输入描述:
有做组测试数据.每一组数据有两行,第一行输入n(表示猴子的总数最多为100)第二行输入数据s(从第s个猴子开始报数)和数据m(第m个猴子退出报数).当输入0 0 0时表示程序结束.
输出描述:
每组数据的输出结果为一行,中间用逗号间隔。
输入输出样例
输入样例#:
10 2 5 5 2 3 0 0 0
输出样例#:
6,1,7,3,10,9,2,5,8,4 4,2,1,3,5
解题方法
思路
本题实质上是约瑟夫问题
可以用队列思想解决
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,s,m;
while(cin>>n>>s>>m){
if(n==0&&s==0&&m==0) break;
queue<int> q;
//确定初始报数顺序
for(int i=0,j=s;i<n;i++){
q.push(s++);
if(s>n) s=1;
}
//报数过程
int cur,num=1;
while(true){
cur=q.front();
q.pop();//出队
if(num==m){
num=1;//下一个报的数是1
if(q.empty()){
cout<<cur<<endl;
break;
}else{
cout<<cur<<",";
}
}
else{
q.push(cur);
num++;
}
}
}
return 0;
}