设有n个人排成一圈,其编号1~n,,从编号为1的人开始报数,按顺时针“1,2,3,4”循环报数,数到m的人出列,然后出列者的下一个人开始重新报数,数到m的人又出列,如此反复循环,直到n个人都出列为止。要求输出n个人的出列顺序
例如,有8个人的初始序列1 2 3 4 5 6 7 8 ,则出列顺序4 8 5 2 1 3 7 6
分析:采用容器array存人的编号,设人的编号放到从1放到n,每次数到m的人出列,下标t=(t+m)%i的人出列(t初始值设为0,i表示目前队列中还剩的人数),编号是的人出列后,t后面紧跟的人补到t的位置,后面的依次补上,重新形成一个环形队列,中间不空。然后,紧接上次轮到的位置开始报号.......
void josepbus(int n,int m)
{
int* p=new int[n+1];
for(int i=0;i<n;++i)
p[i]=i+1;
int t=0;
for(int j=n;j>=1;--j)
{
t=(t+m-1)%i;
printf("%d",p[t]);
//t后的元素依次前移
for(int j=t+1;j<=i-1;j++)
p[j]=p[j+1];
}
printf("\n");
}
版权声明:本文为qq_34793133原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。