C语言——N个人围成一圈报数淘汰问题

《一》问题描述:

        有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 }
View Code

     

     

       

     

原文地址:https://www.cnblogs.com/weiyikang/p/5043805.html