题目描述
约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入
每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行是: 0 0
输出
对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
代码
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
template<class T>
T Joseph(vector<T> &a,int n,int m){
vector<int>::iterator iter;
a.resize(n);
T q=1;
for (iter=a.begin();iter<a.end();++iter,q++) *iter=q;//每个骑士标上号码
int now=1;
for(int i=0,s=n;i<s;i++){
iter=a.begin();
now=now+m-1;
if(now>n){
while (now>n){//fabulous!!
now=now-n;
}
}
iter+=(now-1);
if (i!=s-1) a.erase(iter);//剔除这个骑士
n--; //a.pop_back();
}
return *iter;
}
int main(){
int record;
int p[100][100];
for (int i=0;i<100;i++){
cin>>p[i][0]>>p[i][1];
if ((p[i][0]==0)&&(p[i][1]==0)){
record=i;
break;
}
}
int *r=new int[record];
for (int i=0;i<record;i++){
vector<int> ivec;
r[i]=Joseph(ivec,p[i][0],p[i][1]);
cout<<r[i]<<endl;
}
return 0;
}