兄弟,这算法让我自己想是绝对想不到的;刚才调试了下,弄清了算法的基本思路,大致如下:
程序代码:
void Josegh(void) { int i,j; int s1,w; //s1跟踪数数的步调(初始值为1);w为中间变量,用来保存要出列的人的序号 s1=s; for(i=1;i<=n;i++) p[i-1]=i;//用数组存储序号 for(i=n;i>=2;i--) //n=100 { s1=(s1+m-1)%i; //此时的s1为数到10的人的序号,s1=0以下特殊处理 if(s1==0)//刚好为未出列的最后一员 s1=i; w=p[s1-1];//中间变量存储要出列的人的序号 for(j=s1;j<=i-1;j++) //若出列的人不是最后一个,则从出列的人以后依次向前移动一位 p[j-1]=p[j]; p[i-1]=w; //移动后空出的最后以为存储w即出列的人的序号 }//这样反复循环后,数组中存储的为依次出列的序号的逆序,下面有用到for循环逆序输出的语句就是刚好要出列的人的依次序号 }
A real warrior never quits.