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 }
运行结果: