《一》问题描述:

有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,

凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。

问此人原来的位置是多少号?

《二》问题解决:

1.定义数组记录每个编号的状态(是否被淘汰);

2.在未被淘汰的人中检查是否数到3,若是,淘汰此人;

3.继续此过程至所有人被淘汰;

《三》示例代码:

 #define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h> #define N 13 struct MyStruct
{
int num;
int flag;
}; typedef struct MyStruct people; int main()
{ people a[N];
for (int i = ; i < N; i++)
{
a[i].num = i;
a[i].flag = ;
} for (int i = ; i < N; i++)
{
printf("num=%3d,flag=%3d\n", a[i].num, a[i].flag);
} int count = ;
int i = ;
int index = ;
while (count < N-)
{
while (!a[index].flag)
{
index = (index + ) % N;
}
i++; if (i % == )
{
a[index].flag = ;
count++;
i = ;
}
index = (index + ) % N; } printf("\n");
i = ;
int flagnum;
while (i < N)
{
if (a[i].flag)
{
printf("i=%3d,num=%3d,flag=%3d\t该数为所求\n", i, a[i].num, a[i].flag);
}
else
{
printf("i=%3d,num=%3d,flag=%3d\n", i, a[i].num, a[i].flag);
}
i++;
}
printf("\n"); system("pause");
}
04-27 06:25