推荐http://www.cnblogs.com/EricYang/archive/2009/09/04/1560478.html
原始问题:
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include <iostream>
using namespace std;
#define size 5
void calc(){
int arr[] = {1,2,3,4,5};//数组
int m = 4;//计数
int k = 1;//编号是k的人开始
int repnum=0;//报数
bool b[size];
int pos = k-1;
for(int i=0;i<size;i++)
b[i]=true;
for(i=0;i<size;i++){
while(true){
if(b[pos]){
repnum++;
if(repnum==m){
b[pos] = false;
cout<<arr[pos]<<" ";//4 3 5 2 1
repnum = k-1;
//m = arr[pos];
break;
}
}
pos++;
if(pos==size)
pos=0;
}
}
}
int main(){
calc();
return 0;
}
2、衍生出来的问题
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;此时将m替换成当前出列人的编号,下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include <iostream>
using namespace std;
#define size 5
void calc(){
int arr[] = {1,2,3,4,5};//数组编号
int m = 4;//计数
int k = 1;//编号是k的人开始
int repnum=0;//报数
bool b[size];
int pos = k-1;
for(int i=0;i<size;i++)
b[i]=true;
for(i=0;i<size;i++){
while(true){
if(b[pos]){
repnum++;
if(repnum==m){
b[pos] = false;
cout<<arr[pos]<<" ";//4 3 2 1 5
repnum = k-1;
m = arr[pos];//将计数替换成编号
break;
}
}
pos++;
if(pos==size)
pos=0;
}
}
}
int main(){
calc();
return 0;
}