帮忙解释一下这个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;
}

如何解释?你看不懂?追问

我要是能看懂,我还问吗,int i=-1 是什么意思

追答

//谁知道你是想要帮忙差错,还是根本看不懂?

#include
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;
}

追问

你是不是想杀了我 int k=1; //记录我们第几次杀人的变量
int i=-1;
好人,为啥是为负一

追答

约瑟夫问题来源于一群受迫害的基督徒相约自杀,办法是排成圆环,数到第m个人大家就监督他自杀,然后约瑟夫聪明的选了一个位置、成功活下来的传说。
教学当中可能只是用“出列”一类的描述,但本源就是杀人。

为什么i的初始值是-1:
i 用来表示我们当前数到第几个人,然后数组的编号是从0开始的

for(int j=0;j<m;)
{
i=(i+1)%n; //注意看这句,程序往后数人的方式,是把当前编号 i 加上1,然后如果超出队列长度就恢复成i=0
//设置 i 的初始位置为-1,其实就是表示最初始位置在第一个人的位置之前,加1之后就是第一个人的位置0
if(a[i]!=0)
j++;
}

追问

亲,我懂了,谢谢哈

温馨提示:内容为网友见解,仅供参考
无其他回答

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

C++ 初学者的问题..
首先,为了解决这个问题建立了一个链表。struct jose就是建立链表的节点(结构体),里面有一个code变量储存小孩的编号(可参考单链表的建立),同时定义了一个结构体指针*next,用来指向下一个节点。而Jose *pCur, *pivot都是定义了一个结构体指针,这两个指针在creatRing中初始化,通过函数coutBoy将...

我在网上搜索约瑟夫问题,有个简化版的c程序,但是算法看不明白,有人知道...
也就是你问题中已经分析好了n个值与n-1个值的关系了。那么你要理解的东西就很明白了 那s=(s+m)%i;也就是逆推,假如知道从2个人开始玩约瑟夫,那么逆推出3个人,4个人。。。到n个人不就一样了吗。而公式中的i就是代表玩游戏的人的个数啦。对i求余是将循环过程中如果进行到最后一个人后能...

数据结构课程设计《报数游戏》队列问题 c语言
约瑟夫环问题:如果你用队列做的话,设一个计数器,如果计数器<m就出队后再入队,等于m时那个元素只出队不入队,输出这个元素并且让m等于0。循环到队列为空就行了。

求助, 约瑟夫环问题(C语言)
m=m-1;\/\/提前使q停下,p=q->next,p就是目标。printf("结果是:\\n");printf("出列顺序是: ");\/\/使用q为起始点 do{ i=0;\/\/避免m减一后为零的问题 while(i!=m){ q=q->next;i++;} p=q->next;q->next=p->next;printf(" %d",p->num);m=p->val;\/\/你少了这一步。...

急需一位高手修改一下有关约瑟夫问题的程序!!!
public:int m,n,count,i,j,k;int data;Node* next;void input();void deletelist();};void Node::input(){ cout<<"***约瑟夫环***"<<endl;cout<<"请输入总人数:n=";cin>>n;cout<<endl;cout<<"请输入报数的元素:m=";cin>>m;cout<<endl;\/*cout<<"请输入开始报数的人的序号:...

约瑟夫问题
约瑟夫环:约瑟夫环问题的一种描述是:编号为1.2.3…….n的n个人按顺时针方向围坐一圈 ,每人手持一个密码(正整数),开始任意选一个整数作为报数上限值,从第一 个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密 码作为新的m值,从他顺时针下一个人开始重新从1开始...

急求好心高手帮忙改改约瑟夫问题(要交了)编译通过了,但没有输出。谁能...
没有死循环 只是两个while嵌套,需要的时间比较多。 不信的话 你可以把n的设小一点(比如:2、3之类的)至于,逻辑错误我就没有看了。。呵呵 如果需要看,等我下午帮你看看

帮忙改一下约瑟夫环,高分求助,如果采纳补加200以上
"<num;p->next=q->next;} } int main(){ createLink();outputRlt();return 0;} 先前的代码我这里就能运行,我用的是vs2005,如果你的编译器不一样,那么有可能是头文件问题,你试下把头文件的using namespace std这一行去掉,然后把#include"iostream"改成#include"iostream.h"...

相似回答