N个人围成一圈顺序编号,从1号开始按1、2、3…顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推,按退出顺序输出每个退出人的原序号。
#define M 100 // M > N
void Joseph(int N, int p) {
int queue[M];
int head, tail, i;
for (i = 1; i <= N; i++) {
queue[i] = i;
}
head = 1;
tail = N;
i = 1;
while (head != tail) {
if (i != p) {
tail = ++tail % M;
queue[tail] = queue[head];
}
else {
printf("%d ", queue[head]);
i = 0;
}
i++;
head = ++head % M;
}
printf("%d\n", queue[head]);
}
网友评论