队列实现报数:
问题描述:有M个人,从1到M编号,按照编号顺序围成一圈。从第一个人开始报数(从1报到N),凡报到N的人退出圈子。然后下一个小朋友会继续从 1 开始报数,直到只剩一个人为止
问:最后留下的人的编号是几号。
具体方法代码的注释已经很详细了。(开一个队列不断删除,很简单,稍微想一下或画个草图就ok了)。
#include<iostream>
#include<queue>
using namespace std;
queue<int> q;//开一个队列
int m,n;
int temp[1000],p=0;//开一个临时数组和临时变量用来传数
void d(int m,int n){
if(m==1){//满足条件就输出最后一个大宝贝
cout<<q.front();
return ;
}
for(int i=1;i<=n;i++){//将队首元素不断地弹出加到队尾,直到队首报数为n,
if(i==n){
q.pop();
d(m-1,n);//一个一个弹出,不断的找
}
temp[++p]=q.front();
q.pop();
q.push(temp[p]);
}
}
int main(){
cin>>m>>n;//输入人数和要删除数号
for(int i=1;i<=m;i++){//将人数按顺序入队
q.push(i);
}
d(m,n);
return 0;
}