约瑟夫环

Posted on 2020-05-17 08:01  黑炽  阅读(159)  评论(0编辑  收藏  举报
 1 //挺有意思的小游戏,可以在N,M这里改动数据。
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #define N 41//总人数
 5 #define M 3//数到3 出列
 6 int main(void) {
 7     int people[N] = { 0 };
 8     int coun = 1, i = 0, pos = -1;
 9     int alive = 0;//或者的人数
10 
11     while (coun <= N) {
12         pos = (pos + 1) % N;//环状处理
13         if (people[pos] == 0)    i++;//如果没有报到该数,则继续往下
14         if (i == M) { 
15             i = 0; 
16             people[pos] = coun;//表明第coun个出局的人的编号
17             coun++;
18         }//重新报数了呗
19     }
20 
21     printf("\n约瑟夫排列(最初位置--约瑟夫环位置): \n");
22     for (i = 0; i < N; i++) {
23         printf("%d %d    ", i + 1, people[i]);
24         if (i != 0 && i % 10 == 0)    printf("\n");//输出10个换行
25     }
26 
27     printf("\n\n准备剩下的人数: ");
28     scanf("%d", &alive);
29     printf("这%d个人初始位置应该排在下列序号处:\n", alive);
30 
31     alive = N - alive;//计算需要跳过的人数的编号,跳过20个,alive就是20,
32     //下面是查找需要保留的编号
33     for (i = 0; i < N; i++)    if (people[i] > alive)    printf("初始序号: %d, 约瑟夫环序号: %d\n", i + 1, people[i]);
34     printf("\n");
35     return 0;
36 
37 }