C语言——N个人围成一圈报数淘汰问题
有13个人围成一圈(编号为1~13),从第 1个人开始从 1报数,
凡报到 5的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。
问此人原来的位置是多少号?
(目测是约瑟夫问题的变形,是线性表中顺序表的一个应用实例)
#include <stdio.h>
#define N 13
struct mystruct
{
int num;
int flag;
};
typedef struct mystruct people;
int main()
{
int i, j;
j = 1;
people a[N];
int count=1;
for (i = 0; i < N; i++)
{
a[i].num = i;
a[i].flag = 1;
}
for (i = 0; count < N; i++)
{
while (a[i].flag == 0) {
i++;
}
if (j % 5 == 0) {
printf("%-3d%d\n", count, a[i].num +1);
a[i].flag = 0;
j = 0;
count++;
}
if (i == N - 1)
i = 0;
j += 1;
}
printf("剩下的是:");
for (i = 0; i < N; i++) {
if (a[i].flag != 0)
printf("%-3d", a[i].num+1);
}
return 0;
}