0012 约瑟夫问题

问题描述:

  M个人围成一圈,从第一个人开始报数,数到n的人出圈。再由下一个人开始报数,数到n的人出圈。...打印出依次出圈的人的编号。M值预先选定,n的值由键盘输入。

算法分析:

  根据题意,定义整形数组a用来存储围成一个圈的人员编号;定义常量M为这个圈的总人数,定义整型变量n表示出圈人的编号。本题中,M值为8.

  使用for循环,循环变量j由M变化到0,依次打印编a[(i+n-1)%j],即为出圈人的编号。每有一个人出圈,数组a重新初始化,长度为减1.

代码展示:

 1 #include<stdio.h>
 2 #define M 8
 3 int main(){
 4     int a[M+1];
 5     int n;
 6     int i,j,k;
 7     printf("M的值为:8,请输入n的值:");
 8     scanf("%d",&n);
 9     for(i=0; i<=M; i++) {
10         a[i] = i+1;
11     }
12     printf("依次出圈人的编号为:\n");
13     i=0;
14     for(j=M; j>0; j--){
15         i = (i+n-1) % j;
16         printf("%d ",a[i]);
17         for(k=i; k<j-1; k++){
18             a[k] = a[k+1];
19         } 
20     }
21     printf("\n");
22     return 0; 
23 }

运行结果:

 

posted @ 2021-10-16 18:31  空梦。  阅读(37)  评论(0)    收藏  举报