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 }