题目:
设n个人围坐在一个圆桌周围,现在从第s个人开始报数,数到第m个人,让他出局;然后从出局的下一个人重新开始报数,数到第m个人,再让他出局,……,如此反复直到所有的人全部出局为止。
解答:
void Josephus(int A[], int n, int s, int m)
{
int i;
int j;
int k;
int tmp;
for (i=0; i<n; i++) //给数组赋值
{
A[i] = i+1;
}
i = s - 1;
for (j=n; j>1; j--)
{
i = (i+m-1) % j; //计算出局数字
for (k=i; k<j-1; k++)
{
tmp = A[k];
A[k] = A[k+1];
A[k+1] = tmp;
}
}
for (j=0; j<n/2; j++)
{
tmp = A[j];
A[j] = A[n-j-1];
A[n-j-1] = tmp;
}
for (i=0; i<n; i++)
{
printf("%d/n", A[i]);
}
}