求用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);

}
相似回答