Joseph数的实现
1、 问题
对于有n个人,每个人的编号唯一并且都是从1到n。现在指定一个人为起始位置,开始报数,当报到m时,报数为m的人退出。然后从退出的那个人的下一个开始从新报数……循环这个过程,指定n个人都退出位置。
2、 思想
对每个人都设置一个标记为,初始化时,标记为0,对于离开的人,表记为1;每次都遍历,直到找到第m个人,他的flag标记为0;然后置这个人的flag为1
3、 代码实现
|
void joseph3(int *array,int len,int step,int start) { /************************************************************************/ /* start起始位置:1,2,3...,n *step:每次要报数的人数,例如5,那么从1 开始报数,那么报到5时,该人退出。 */ /************************************************************************/ int i=0,count=0; int *flag=new int[len]; for(i=0;i<len;i++) { flag[i]=0; } cout<<endl; int k=0; int cur_pos=(start-1+step-1)%len;//start>=1,step>=1 while(count<len) { cout<<array[cur_pos]<<" "; flag[cur_pos]=1; count++; //cur_pos++; k=0; while(k<step&&count<len) { cur_pos=(cur_pos+1)%len; if(flag[cur_pos]==0) { ++k; } } } cout<<endl; delete[] flag; } void test_joseph() { int len=10; int *array=new int[len]; for(int i=0;i<len;++i) { array[i]=i+1; cout<<array[i]<<" "; } cout<<endl; joseph3(array,len,5,1); } |