#include
#include
typedef struct node /*声明一个链表节点*/
{
int number;
struct node *next;
}Node;
Node* CreatNode(int x) /*创建链表节点的函数*/
{
Node *p;
p=(Node*)malloc(sizeof(Node));
p->number=x;
p->next=NULL;
return p;
}
Node* CreatJoseph(int n) /*创建环形链表,存放整数1到n*/
{
Node *head,*p,*q;
int i;
for(i=1;i<=n;i++)
{
p=CreatNode(i);
if(i==1)
head=p;
else
q->next=p;
q=p;
}
q->next=head;
return head;
}
void RunJoseph(int n,int m) /*模拟运行约瑟夫环,每数到一个数,将它从环形链表中摘除,并打印出来*/
{
Node *p,*q;
p=CreatJoseph(n);
int i;
while(p->next!=p)
{
for(i=1;inext;
}
q=p->next;
p->next=q->next;
p=p->next;
printf("%d--",q->number);
free(q);
}
printf("\n最后剩下的数为:%d\n",p->number);
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
RunJoseph(n,m);
return 0;
}
(二)递归法
要想用到递归法就必须找到f(n)和f(n-1)之间的关系,那么约瑟夫环有没有这样一个规律关系在呢,答案是有的。#include
int Joseph(int n,int m)/*计算约瑟夫环的递归函数*/
{
if(n<=1||m<=1)
return -1;
if(n==2)
{
if(m%2==0)
return 1;
else
return 2;
}
else
{
return (Joseph(n-1,m)+m-1)%n+1;
}
}
int main()
{
int n,m,x;
scanf("%d %d",&n,&m);
x=Joseph(n,m);
printf("最后一个数为:%d\n",x);
return 0;
}
#include
int Josephus(int n,int m)/*计算约瑟夫环问题的迭代法函数*/
{
int i;
int x,y;
if(n<=1||m<=1)
return -1;
if(m%2==0)
y=1;
else
y=2;
for(i=3;i<=n;i++)
{
x=(y-1+m)%i+1;
y=x;
}
return y;
}
int main()
{
int n,m,x;
scanf("%d %d",&n,&m);
x=Josephus(n,m);
printf("最后一个的编号是: %d\n",x);
return 0;
}