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

追问

亲,我懂了,谢谢哈

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