-
约瑟夫问题也叫做约瑟夫环,是一个数学应用问题。
-
已知有n个人(分别编号为1,2,3…n)围坐成一圈,从第一个人开始报数,报到数m的人出圈;再从下一个人开始重新报数,报到m的人出圈;直至剩下最后一个人的时候游戏结束。输出剩下的人的原始编号。
-
主要的是 要先想到队列这种数据结构的性质 队列头部出去,对尾进
-
想到把要报到m的人不再读入队列中
#include<iostream>
using namespace std;
const int N=1000;//可能比较耗费空间
int q[N];
int main(){
int n;
cin>>n;
int i;
for(i=1;i<=n;i++){
q[i]=i;
}
int m;
int head=1,tail=n+1;//tail放在n+1的位置
int j;
cin>>m;
while(head<tail){//外循环,判断队列(环)好久结束
j=m-1;
while(j--){//内循环 表示隔多少个再报数
q[tail]=q[head];
tail++;
head++;
}
head++;
}
cout<<q[tail-1]<<endl;//外循环结束的条件是head=tail .此时二者等效
return 0;
}