求用c语言做约瑟夫环问题

1。设有n个人围坐一圈,现以某个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人又出列,如此下去,直到所有人都出列为止.按出列顺序输出.
要求:对于给定的1,2,…,n 中的k 个数,Josephus 想知道是否存在一个正整数m 使得(n,m)Josephus 排列的最后k 个数恰为事先指定的这k 个数。
@#¥@可以使用循环队列和单循环链表两种方式

第1个回答  2011-12-09
#include<stdlib.h> /*杂类声明*/
#include<stdio.h>
struct node
{
int num;
int key;
struct node *prior,*next;
};

void main()
{
int n,m,i,j,k;
struct node *head,*p,*s;
printf("\t\t\t The question of YSFH\n\n\n");
printf("Please input num of person :");
scanf("%d",&n);
printf("\n");
printf("Please input m=");
scanf("%d",&m);
printf("\n");
s=(struct node*)malloc(sizeof(struct node));
for(i=1;i<=n;i++){
if(i==1)
head=s;
p=s; /*P指向新建的接点*/
p->num=i;
s=(struct node*)malloc(sizeof(struct node)); /*创建下一个结点,*/
p->next=s; /*创建下一个结点,连接在P后*/
s->prior=p;
}
p->next=head; /*所有结点创建完毕,把尾指针与头指针相连*/
head->prior=p;
free(s);
p=head;
printf("\nDequeue Sequence :");
i=1;
while(p->next!=p)
{
if(i==n)
i=1;
j=0;
while(j!=m)
{
p=p->next;
j++;
}
printf("%3d",p->prior->num);
p->prior->prior->next=p; /*删除结点,作结点前后结点的连接*/
p->prior=p->prior->prior;
i++;

}
printf("\n");
}
用单循环链表做的本回答被提问者采纳
第2个回答  2011-12-09
自己写的,一维数组轻松解决
//功能:解决约瑟夫问题

#include<stdio.h>
#define N 9
#define K 2
#define M 3

//给数组赋值
void setDate(int a[],int n)
{ int i;
for(i=0;i<n;i++)
a[i]=i+1;
}
//删除被选中的孩子
void deleted(int a[],int m,int len)
{
int i=m;
do
{
a[i]=a[i+1];
i++;
}while(i<len);
}

//开始play
void play(int a[],int k,int m)
{
int len =N;
int dm=k+m-2;//第一个被剔除的孩子
while(len!=1)
{printf("第%d个孩子被剔除。\n",a[dm]);
deleted(a,dm,len);//将被剔除的孩子从数组中删除
dm=dm+M-1;//下一个被剔除的孩子
len--;//数组的长度减1
if(dm>=len) dm=dm-len;
}
printf("最后一个孩子是%d.",a[0]);//最后一个孩子被放在a[0]中
}
main()
{
int a[N];
setDate(a,N);
play(a,K,M);

}

约瑟夫环(单向循环链表)_C语言「抄作业」
约瑟夫环问题 该问题求解Josephus与最后存活的另一人最初的位次。具体而言,当剩余人数为n时,从第一个人开始,每报数k次后,淘汰当前报数者,直到最后剩下2人。最终,Josephus与另一人分别位于第16和第31的位置上。示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Joseph...

C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
循环链表实现约瑟夫环 约瑟夫环问题是一个经典的应用场景,描述了在一定规则下的淘汰机制。该问题的基本设定是 n 个人围坐在圆桌周围,从指定编号开始,按照特定规则进行淘汰,直到仅剩一人。循环链表是实现该问题的关键结构。考虑一个示例场景:假设圆桌上有 5 人,从编号为 3 的人开始,每数到 2 的...

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
程序可以运行的

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

求助, 约瑟夫环问题(C语言)
\/\/使用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;\/\/你少了这一步。m=m-1;\/\/提前使q停下,p=q->next,p就是目标。free(p);}while(q->next!=q);printf(" %d\\n",...

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

求用循环队列解决约瑟夫环问题的C语言代码,急,速度!!!
void Fmade(int x, int y, int z);void main(){ int a, b, c;\/\/t i, j, k;\/\/t aa[100], b[100];cout<<"请输入总人数:";cin>>a;cout<<endl<<"请输入开始位子:";cin>>b;cout<<endl<<"请输入步长:";cin>>c;Fmade(a, b, c);} void Fmade(int x, int y, ...

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

相似回答