约瑟夫问题【2】
接约瑟夫问题【1】这篇博客,不同输出要求继续敲码。
题目:n个人围成一圈,顺序排号,从第1个人(编号为0的人)从1开始报数,报到m(m<=n)的人出圈,然后下面未出圈的人接着从1开始报数,直到所有人都出圈。请按顺序输出出圈的序号。
步骤: (1)由于对于每个人只有出圈或不出圈两种状态。因此设置标志数组存放游戏过程中每个人的状态。不妨用1表示出圈,0表示不出圈。
(2)给标志数组赋初值为0。
(3)模拟报数游戏的全过程。t从1变化到m控制报数游戏的每节循环,用s累计每节报数的数值,用f统计出圈的总人数;因此游戏结束的条件就是f=m。
代码如下
1 //报数出圈 2 #define _CRT_SECURE_NO_DEPRECATE 3 #include"stdio.h" 4 #include <iostream> 5 using namespace std; 6 7 int main(void){ 8 int a[100] = {0}; 9 int b[100] = {0}; 10 int m = 0,n = 0; 11 int i = 0,//a的循环 12 j = 1,//报的数 13 l = 0;//b的循环 14 scanf("%d %d",&m,&n); 15 while(1){ 16 if(j == n){//报到5后,将编号写入B数组,报数初始化,A数组该成员置1 17 j = 0; 18 a[i] = 1; 19 b[l++] = i+1; 20 } 21 if(l == m){//b数组填充了m个数,跳出循环 22 break; 23 } 24 j++; 25 do{//跳过置1的a数组成员 26 i++; 27 if(i == m) 28 i = 0; 29 }while(a[i] == 1); 30 } 31 for(i = 0;i < m;i ++) 32 printf("%d ",b[i]); 33 printf("\n"); 34 return 0; 35 }
实验结果如下