用C++数组实现约瑟夫环的问题

设有n个人围坐在圆桌周围,现从某个位置 i 上的人开始报数,数到 m 的人就站出来。下一个人,即原来的第m+1个位置上的人,又从1开始报数,再是数到m的人站出来。依次重复下去,直到全部的人都站出来,按出列的先后又可得到一个新的序列。

例如:当n=8,m=4,i=1时,得到的新序列为:
4,8,5,2,1,3,7,6
编写程序模拟整个过程,并依次输出出列的各人的编号。

拜托高手帮忙做一下,用C++数组实现,变量用题目中的字母即可。

#include<iostream.h>
int main()
{
const int n=8;
int m=4;
int a[n];

for(int j=0;j<n;j++)
a[j]=j+1;
int k=1;
int i=-1;

while(1)
{

for(int j=0;j<m;)
{
i=(i+1)%n;
if(a[i]!=0)
j++;
}
if(k==n)
break;
cout<<a[i]<<",";
a[i]=0;
k++;
}
cout<<a[i]<<endl;
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-08
#include <stdio.h>
#include <string.h>

#define n 8

void main(void)
{
unsigned char p[n];
unsigned char m,i;
unsigned char len,w;

for(i=0;i<n;i++)
{
p[i] = i+1;
printf("%d ",p[i]);
}

printf("\ninput m,i : ");
scanf("%d,%d",&m,&i);

if(i>n || i<1 || m<1)
{
printf("input error!\n");
return;
}
else
{
len = n;w = 0;
while(len>0)
{
w += (i+m-2)%len;
w = w%len;
printf("%d ",p[w]);
len --;
if(w<len)
memcpy(p+w,p+w+1,len-w);
}
}
printf("\n");
}
第2个回答  2011-04-13
#include<iostream.h>

void main()
{

int n,start,m,i,count,j;

while(cin>>n>>start>>m)

{

int *p=new int [n];

for(i=0;i<n;i++)

p[i]=i+1;

count=1;start--;

while(count<n)

{

cout<<p[start]<<" ";

for(j=start;j<n-count;j++)

{

p[j]=p[j+1];

}

start=(start+m-1)%(n-count);

count++;

}

cout<<p[0]<<endl;

}

}

求C++约瑟夫猴子选大王问题,要用数组与最基本的方法。必重谢!!!_百 ...
\/\/约瑟夫环---数组 #include <stdio.h>#include <stdlib.h>int main(){int* s=NULL;int result[50];int c=0;int i,n,m,p=0,count=0;while(1){scanf("%d",&n);scanf("%d",&m);if(n==0 && m==0){break;}if(s!=NULL){free(s);}s=(int*)malloc(sizeof(int)*n);fo...

利用C++解决约瑟夫问题。
这里补充一下约瑟夫问题的描述:N个人围成一圈,从第一个开始报数,数到M的人出队,然后他的下一位继续从1开始报数,数到M的出队,如此循环直到剩下一个人,求最后剩下的那个人最初是队伍中的第几位。解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否...

用C++编写约瑟夫环的代码,也就是出圈问题,n个人,数到k出圈,接着从1开 ...
m,s"<<endl; cin>>n>>m>>s; if(n<=0||s<=0||m<=0) { cout<<"error"<<endl; } int i,j,k,temp;\/\/k为次数 int A[100]; for(i=0;i<n;i++) { A[i]=i+1;

C++编程:约瑟夫环问题。
\/\/ 约瑟夫环的头指针 struct Prisoner * head;\/\/ 第一个被处决的犯人的节点指针 struct Prisoner * firstPunishedPrision;};JosephCircle::JosephCircle(int N,int S,int D){ struct Prisoner * p , *pr;\/\/ 约瑟夫环的头指针初始化为空 this->head = NULL;\/\/ 构造一个由 N 个犯人组成的约...

C++ 约瑟夫环问题
(1) 出圈游戏一:使用动态数组来接收输入,参加的人数和报数上限可变 (2) 出圈游戏二:使用循环链表来接受输入,参加的人数和报数上限可变 (3) 参加游戏者的编号和姓名存入文件play.txt中,按出圈顺序将出圈者的编号和姓名存入文件result.txt中。(4) 利用菜单提供用户界面,菜单格式如下:1. ...

c++问题小孩出列 求助!谢谢 我用n=90 s=7 m=5测试 得出的结果一到了8...
这个是约瑟夫环问题,使用循环链表做最简单,当然用数组模拟也可以,只不过要把数组假想成一个循环队列,这样才能正确模拟,使用for循环不好,不清楚到底是多少次循环,所以要用while循环,改动后代码如下:total = n;\/\/加在输入n之后,int 型 在 cout<<"Now,children of order row is :"<<endl;...

求约瑟夫环问题的解法
自己写的 C++程序 希望对你有帮助 \/*约瑟夫环 Joseph 是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。例如:...

敢死队问题 C\/C++
这是个约瑟夫环逆问题 推导是这样的:为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(...

1编写函数求:1-1\/2+1\/3-1\/4+...+1\/n C++
第二道题是约瑟夫环问题,我之前做过,先给你贴上。第一道题等等给你做。include <stdio.h> include <stdlib.h> define N 100 void Fri(int M,int n){ int count=0;\/\/计数器 int i=0;\/\/控制循环的变量 int p=0;\/\/出场后玩家的人数(每局一个玩家出场)int a[N]={0};\/\/将储存...

约瑟夫游戏问题
约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。 题目中30个人围成一圈,因而启发我们用一个循环的链来表示。可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。从第一个人开始对...

相似回答