约瑟夫环问题

编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人
持有一个密码(正整数).一开始任选一个正整数作为报数的上
限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m
时停止.报m的人出列,将他的密码作为新的m值,从他在顺时针
方向上的下一人开始重新从1报数,如此下去,直到所有人全部
出列为止.编程打印出列顺序.

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode{
int number;
struct LNode *next;
}LNode,*LinkList;
//建立线性表
int InitLinkList(LinkList &L){
L=new LNode;
if(L==NULL) return 0;
L->next=NULL;
return 1;
}
//对线性表进行初始化
int InputLinkList(LinkList &L,int m){
int i=1;
LNode *p,*tail=L;
while(i<=m){
p=new LNode;
p->number=i;
p->next=tail->next;
tail->next=p;
tail=p;
i++;
}
p->next=L->next;
return 1;
}
//删除指定节点后的节点
int DeleteAfterLNode(LinkList &L,LNode *p){
printf("%d\n",p->next->number);
LNode *q=p->next;
p->next=q->next;
q->next=NULL;
free(q);
return 1;
}

请帮忙吧这个程序完善一下,必要可以改动一下,感激不尽!

约瑟夫问题

#include <iostream.h>
void main()
{
//建立小孩数组
const int num=10; //小孩数
int interval; //每次数interval个小孩,便让该小孩离开
int a[num]; //小孩数组
//给小孩编号
for(int i=0; i<num; i++) //小孩的编号只与小孩数有关
a[i]=i+1;
//输入数小孩间隔
cout <<"please input the interval: "; //输入一个数小孩个数
cin >>interval;
//将全体参加的小孩输出
for(int i=0; i<num; i++) //顺序输出开始时的小孩编号
cout <<a[i] <<",";
cout <<endl;

int k=1; //标识处理第k个离开的小孩
int i=-1; //数组下标(下一个值0就是第一个小孩的下标)
//处理获胜前的小孩
while(1){
//在圈中数interval个小孩
for(int j=0; j<interval; ){
i=(i+1)%num; //对下标加1求模
if(a[i]!=0) //如果该元素的小孩在圈中,则承认数数有效
j++;
}
if(k==num) break; //该小孩是最后一个(胜利者)吗?
cout <<a[i] <<","; //输出离开的小孩之编号
a[i]=0; //标识该小孩已离开
k++; //准备处理下一个圈中小孩
}
//break语句跳转到此
cout <<"\nNo." <<a[i] <<" boy've won.\n"; //输出胜利者
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-15
约瑟夫环根本就不需要链表处理,只要一个一维数组就可以了。。你一定要用链表处理吗,这个比较麻烦。。

这或许是你能找到的最详细约瑟夫环数学推导!
约瑟夫环问题描述的是,给定一定数量的数字排列成圆圈,从某数字开始,每次删除序列中的第一定数量的数字,直至只剩一个数字为止,求最终剩余的数字。例如,五个数字组成圆圈,从数字0开始,删除第3个数字,经过几步操作后,剩下的数字为2。解决约瑟夫环问题,可以采用倒推方式,即从最终状态反推原始状态。

约瑟夫环公式是怎样推导出来的?
1、约瑟夫环公式推导:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列。依此规律重复下去,直到圆桌周围的人全部出列。这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三...

有n个人围成一圈从1-3报数
n个人按顺序围成一圈(编号为1~n),从第1个人从1开始报数,报到k的人出列,相邻的下个人重新从1开始报数,报到k的人出列,重复这个过程,直到队伍中只有1个人为止,这就是约瑟夫问题。现在给定n和k,你需要返回最后剩下的那个人的编号。二、约瑟夫问题 约瑟夫问题,或称“约瑟夫环”,又名“丢手绢...

约瑟夫环的介绍
约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1...

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

约瑟夫环的问题求解
约瑟夫环问题是一个数学问题,源自于古罗马历史学家约瑟夫斯的故事。在公元前67年,约瑟夫斯和他的同伴们在被罗马人占领的约塔帕塔镇面临自杀的威胁。他们提议所有人都围成一个圈,并按照特定规则进行轮次消减,直到仅剩下一人。约瑟夫斯和他的朋友通过选择特定的位置保住了性命,最终成为了著名的罗马历史...

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

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

c语言题目;有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3...
这个问题叫约瑟夫环问题。n个人围成一圈,按顺序编号,分别为1、2、3..n。(你可以理解成每个人的座号)。然后1号开始,每人依次报号。即 (这里假设n=5)(前面是座号、后面是他报的号)1:1 2:2 3:3(退出)现在只剩下座号为1、2、4、5的人,从3的下一个开始报号 4:1 5:2 1:3...

C语言做约瑟夫环问题要注意哪些问题
1,查找到的位置,要做标记,以便下次不会再重复。删除或是移出队列 2,查找到最后的一个位置后,要从开始再计数。注意不能超越下标,或是访问非法结点。3,有多个元素(X),就要循环X-1次,以保证最后结果个数的正确性。

相似回答
大家正在搜