C++ 约瑟夫环问题 代码求解释~

#include<iostream>
using namespace std;
int main()
{
const int n=100;
int m=30;
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;
a[i]=0;
k++;
}
cout<<a[i]<<endl;
return 0;
}

首先,这个代码输出的是,约瑟夫环到达的最后位置。输出结果是15。
//把iostream这个文件中的内容复制到这个地方。
#include<iostream>
using namespace std;
int main()
{
//定义一个常量的整形100,表示人的个数。
const int n=100;
//定义约瑟夫环的参数。
int m=30;
//定义一个数组,用于计算约瑟夫环的位置。
int a[n];

//给数组赋值,让数组的每个值就是这个元素的编号。
for(int j=0;j<n;j++)
a[j]=j+1;
//定义一个标志k,当K等于N的时候,表示到达约瑟夫环的最后位置。
int k=1;
int i=-1;
while(1)
{
for(int j=0;j<m;)
{
//不停的取数组的下一个元素。
i=(i+1)%n;
//如果这个元素没有被标记为0,说明这个位置还没有被排除,j加1,进入下一个循环
if(a[i]!=0)
j++;
}
//如果标志K等于n,说明约瑟夫环的循环到达最后一个位置,跳出While死循环。
if(k==n)
break;
//否则,把这个位置的元素设为零,标志它被排除。
a[i]=0;
//标志+1。
k++;
}
//输出约瑟夫环到达的最后一个位置。
cout<<a[i]<<endl;
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-16
int main()
{//计算约瑟夫环最后一次取出的号码,约瑟夫环编号方式为1,2,3,4…… 每次隔m个取出下一个
const int n=100;
int m=30;
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;)
{//在当前环内往前走m步,用a[i]=0表示该编号已经取出,若遇此编号不算入步数。
//每次前进1步后对n取余数,实现环的遍历
i=(i+1)%n;
if(a[i]!=0)
j++;
}
if(k==n)//已经取出n个,退出循环
break;
//尚未取完,将当前要取出的赋为0,表示已经取出
a[i]=0;
k++;//取出个数加1
}
//跳出循环时a[i]的值表示当前要取出的编号,即最后取出编号
cout<<a[i]<<endl;
return 0;
}

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

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

用C++编写约瑟夫环的代码,也就是出圈问题,n个人,数到k出圈,接着从1开 ...
include <iostream> using namespace std; int main() { int n,s,m; cout<<"please input the valuse of n,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+...

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

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

c++ 点名问题
这是典型的约瑟夫环的问题 include <stdio.h> int main(void){ int n,m, i, s=0;printf("输入n,m:");scanf("%d%d",&n,&m)for (i=2; i<=n; i++)s=(s+m)%i;printf ("最后留下的是原来第%d号\\n", s+1);} 如果楼主不求最后剩下的那个,而是求依次退出的编号顺序 那么...

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

用C++写约瑟夫环和多项式的线性运算
using namespace std;\/\/该程序调用容器vector,但是main函数的内容无需改动,面向对象 struct Player { int Number; \/\/游戏者的编号 int Secret; \/\/游戏者的密码 Player& operator=(Player& T){ Number = T.Number;Secret = T.Secret;} };class LinkList { private:vector<Player>::itera...

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

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

相似回答