//一共十个人,编号为1到10,从第一个人开始数数字,按照1,2,3的顺序循环,数到3的人出列,直到剩下最后一个人,输出这十个人的派出次序;
//实现Josephus(约瑟夫环);
#include<stdio.h>
void Josephus_Ring(int a[],int n,int s)
{
int i=0;
while(n>1)
{
i=i+s-1; //每次前进的个数为2;
if(i>n-1) //到了结尾,重新进入开头,i与n的起始数不同;
i=i%n;
int x=a[i]; //要提出的数;
for(int j=i;j<n-1;j++)//利用循环把所有后面的项进行前移;
//由于需要删除一个数,n减少一个数,所以n的总数减少1;
a[j]=a[j+1];
a[j]=x; //把提出的数排在数组的最后一空余位置,但这个位置是相对当前数组总元素个数的最后的最后一个元素;
n--; //提出一个数,总个数就减1;
}
}
int main(void)
{
int a[10],s=3;
for(int i=0;i<10;i++) //用循环的方式给人数编号
a[i]=i+1;
//调用约瑟夫环函数;
Josephus_Ring(a,10,s);
for(i=9;i>=0;i--) //反向输出这个数组,得到想要的序列;
printf("%d ",a[i]);
printf("\n");
return 0;
}
//电脑录入结果为 4, 10, 5, 8, 1, 7, 2, 9, 6, 3;
//输出结果为倒着输出 3, 6, 9, 2, 7, 1, 8, 5, 10, 4;