求高手 解释 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;
}

//你们这些学生就不肯自己懂点脑子吗,刚刚在别的地方回答了一个一摸一样的

#include<iostream.h>
int main()
{
const int n=8; //一共8个人
int m=4; //每次往后面数到第4个人干掉
int a[n]; //设置一个8个元素的数组,用来表示8个人

for(int j=0;j<n;j++) //循环,将a数组元素分别设置成1到8的编号,表示8个不同的人
a[j]=j+1;

int k=1; //记录我们第几次杀人的变量
int i=-1;

while(1) //杀人大循环,一遍一遍杀人
{

for(int j=0;j<m;) //从第一个人开始,循环向后数到第m个人,这个人可能马上就要被杀
{
i=(i+1)%n;
if(a[i]!=0)
j++;
}

if(k==n) //判断一下已经干掉多少人了,如果只剩最后一个人,就停止杀人,退出杀人大循环
break;
cout<<a[i]<<","; //到这里说明还没杀完,杀掉刚才找到的那个人,并且输出他的编号
a[i]=0; //把表示人数组当中这个人的位置设置成0,表示人已经杀了
k++; //记录我们又杀了一个人
}
cout<<a[i]<<endl; //输出最后活下来的那个人的编号
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-19
复制粘贴...我也懒得动脑子~~~

#include<iostream.h>
int main()
{
const int n=8; //一共8个人
int m=4; //每次往后面数到第4个人干掉
int a[n]; //设置一个8个元素的数组,用来表示8个人

for(int j=0;j<n;j++) //循环,将a数组元素分别设置成1到8的编号,表示8个不同的人
a[j]=j+1;

int k=1; //记录我们第几次杀人的变量
int i=-1;

while(1) //杀人大循环,一遍一遍杀人
{

for(int j=0;j<m;) //从第一个人开始,循环向后数到第m个人,这个人可能马上就要被杀
{
i=(i+1)%n;
if(a[i]!=0)
j++;
}

if(k==n) //判断一下已经干掉多少人了,如果只剩最后一个人,就停止杀人,退出杀人大循环
break;
cout<<a[i]<<","; //到这里说明还没杀完,杀掉刚才找到的那个人,并且输出他的编号
a[i]=0; //把表示人数组当中这个人的位置设置成0,表示人已经杀了
k++; //记录我们又杀了一个人
}
cout<<a[i]<<endl; //输出最后活下来的那个人的编号
return 0;
}
第2个回答  推荐于2018-04-19
#include<iostream.h>
int main()
{
const int n;
int m=4;
int a[n];

for(int j=0;j<8;j++)
a[j]=j+1;

int k=1;
int i=-1;

for(;;)

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;
}本回答被网友采纳

求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++编程:约瑟夫环问题。
\/\/ 基本的约瑟夫构造函数 JosephCircle(int N,int S,int D);\/\/ 发展的约瑟夫构造函数 JosephCircle(int N,int S,int M,int password[]);\/\/ 输出约瑟夫环 void print();\/\/ 开始处决犯人 void start();private:\/\/ 约瑟夫环的头指针 struct Prisoner * head;\/\/ 第一个被处决的犯人的节点指针...

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;...

这或许是你能找到的最详细约瑟夫环数学推导!
至此,数学推导过程基本完成。接下来,我们给出代码实现,以Python、C++和Java三种语言为例。在代码实现时,需要注意从上文分析中是从x开始编号的,而题目是从0开始编号,因此返回值需要进行相应的转换。在理解了上述推导过程后,我们可以得到约瑟夫环问题的数学证明,以及如何从最终状态反推原始状态的解决...

JOSEPHUS 好人 求算法思路,最好有代码
求胜利者的编号。 我们知道第一个人(编号一定是m mod n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m mod n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2 并且从k开始报0。 现在我们把他们的编号做一下转换: k --> 0 k+1 --> 1 k+...

求看下这个用C语言写的约瑟夫环代码错在哪儿
void del_Joseph(Joseph*current_p,Joseph *pre_p)这个函数去掉参数列表,直接用全局变量就行,不去掉反而会错。因为,当他们作为参数传递时,本身的值是不能被改变的。而你在函数中释放掉current_p所指向的空间,但current_p仍指向该空间,导致后面出错。发现这个问题,只要你打印下每次删除的值就行了...

约瑟夫问题的一般形式
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。分析:(1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活。(2...

用java在数组中实现约瑟夫环的问题, 要求写明详细注释, 方法最好简 ...
要求:请用面向对象的思想来处理这个问题并在下面写出具体的代码(可以选择你熟悉的语言,如java\/C++\/C#等)author Administrator \/ public class Ysfh { public static void main(String[] args) { m(3,16);} public static void m(int m,int n){ int c = 1;int[] ns = ntoarray(n);w...

相似回答