《一》问题描述:
有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数,
凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。
问此人原来的位置是多少号?
《二》问题解决:
1.定义数组记录每个编号的状态(是否被淘汰);
2.在未被淘汰的人中检查是否数到3,若是,淘汰此人;
3.继续此过程至所有人被淘汰;
《三》示例代码:
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <math.h> 5 #include <string.h> 6 7 #define N 13 8 9 struct MyStruct 10 { 11 int num; 12 int flag; 13 }; 14 15 typedef struct MyStruct people; 16 17 int main() 18 { 19 20 people a[N]; 21 for (int i = 0; i < N; i++) 22 { 23 a[i].num = i; 24 a[i].flag = 1; 25 } 26 27 for (int i = 0; i < N; i++) 28 { 29 printf("num=%3d,flag=%3d ", a[i].num, a[i].flag); 30 } 31 32 int count = 0; 33 int i = 0; 34 int index = 0; 35 while (count < N-1) 36 { 37 while (!a[index].flag) 38 { 39 index = (index + 1) % N; 40 } 41 i++; 42 43 if (i % 3 == 0) 44 { 45 a[index].flag = 0; 46 count++; 47 i = 1; 48 } 49 index = (index + 1) % N; 50 51 } 52 53 printf(" "); 54 i = 0; 55 int flagnum; 56 while (i < N) 57 { 58 if (a[i].flag) 59 { 60 printf("i=%3d,num=%3d,flag=%3d 该数为所求 ", i, a[i].num, a[i].flag); 61 } 62 else 63 { 64 printf("i=%3d,num=%3d,flag=%3d ", i, a[i].num, a[i].flag); 65 } 66 i++; 67 } 68 printf(" "); 69 70 system("pause"); 71 }