约瑟夫问题【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("
");
34  return 0;
35 }

实验结果如下

原文地址:https://www.cnblogs.com/gaigaichen/p/7603990.html