早教吧 育儿知识 作业答案 考试题库 百科 知识分享

C++约瑟夫问题:求源代码及说明约瑟夫问题:M个人围成一圈,从第一个人开始报数,数到N的人出圈;再由下一个人开始报数,数到N的人出圈;……。输出依次出圈的人的编号。M的值预

题目详情
C++ 约瑟夫问题: 求源代码 及 说明
约瑟夫问题:
M个人围成一圈,从第一个人开始报数,数到N的人出圈;再由下一个人开始报数,数到N的人出圈;……。输出依次出圈的人的编号。M的值预先选定,N 由键盘输入。
这道题的主要算法步骤如下:
(1)由于对于每个人只有出圈或不出圈两种状态。因此设置标志数组存放游戏过程中每个人的状态。不妨用1表示出圈,0表示不出圈。
(2)给标志数组赋初值为0。
(3)模拟报数游戏的全过程。t从1变化到m控制报数游戏的每节循环,用s累计每节报数的数值,用f统计出圈的总人数;因此游戏结束的条件就是f=m。
请同学们实现程序的编码。
样例:
   输入:m=8 n=5
输出:5 2 8 7 1 4 6 3


求源代码 及 说明
不考虑数组的长度!!!
▼优质解答
答案和解析
#include"stdio.h"
int main(void){
 int a[100] = {0};
 int b[100] = {0};
 int m = 0,n = 0;
 int i = 0,//a的循环
  j = 1,//报的数
  l = 0;//b的循环
 scanf("%d %d",&m,&n);
 while(1){  
  if(j == n){//报到5后,将编号写入B数组,报数初始化,A数组该成员置1
   j = 0;
   a[i] = 1;
   b[l++] = i+1;
  }
  if(l == m){//b数组填充了m个数,跳出循环
   break;
  }
  j++;
  do{//跳过置1的a数组成员
   i++;
   if(i == m)
    i = 0;
  }while(a[i] == 1);
 }
 for(i = 0;i < m;i ++)
  printf("%d ",b[i]);
 printf("\n");
 return 0;
}
看了 C++约瑟夫问题:求源代码及...的网友还看了以下:

求教奥数题:把自然数从1开始...把自然数从1开始由小到大依次无间隔地写成一个数.问从第一个数码到  2020-05-16 …

/*3、约瑟夫问题约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始  2020-05-17 …

跪求!C++!利用循环链表实现约瑟夫问题的求解约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围  2020-05-17 …

训练时,若干新兵站成一排,从一开始报数,除了甲以外其他人报的数之和减去甲报的数恰好等于50.请问共  2020-06-16 …

音程中的音数问题我老是搞不通音程中的音数就是音程中的两个音所包含的全音,半音的数目.我搞不懂的是这  2020-06-27 …

C++约瑟夫问题:求源代码及说明约瑟夫问题:M个人围成一圈,从第一个人开始报数,数到N的人出圈;再  2020-07-07 …

请问报数的顺序!我即将军训,但是我忘记了报数到底是从左往右还是从右往左.例如:我站在一排人的最右边  2020-07-22 …

30张扑克牌魔术问题就是一副扑克牌先数30张然后放到一边拿剩下的的开始数不管是几开头都必须数到十比  2020-07-25 …

一个C++约瑟夫环的问题一群人围坐一圈,每人一个密码,一开始人选一个正整数作为报数上线M,丛第一个  2020-07-29 …

约瑟夫环问题解答。需要算法和数据结构1.约瑟夫环问题[问题描述]设有n个人围坐一圈,现从第s个人开始  2020-11-06 …