约瑟夫问题--两种解法

来源:互联网 发布:童年 知乎 编辑:程序博客网 时间:2024/05/18 02:43

题目大家都熟悉:

题目描述

n个人想玩残酷的死亡游戏,游戏规则如下:

n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。

请输出最后一个人的编号。

输入

输入n和m值。

输出

输出胜利者的编号。

示例输入

5 3

示例输出

4


这个约瑟夫问题上年就做过,当时用的是数组,现在在做的话用的是链表,寒假培训的时候做过,再复习一下,两种方法拿在一起比较一下
数组:
#include<stdio.h>
int main()
{
int n,m,i,t,u,a[10000];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
a[i]=i+1;
for(u=0;u<n-1;u++)
{
i=(i+m-1)%(n-u);
for(t=i;t<n-u;t++)
a[t]=a[t+1];
}
printf("%d\n",a[0]);
return 0;
}
链表:
#include<stdio.h>
#include<malloc.h>
struct list
{
int shu;
struct list *next;
};
int main()
{
struct list *head,*p,*q;
int m,n,i;
head=(struct list *)malloc(sizeof(struct list));
head->next=NULL;
q=head;
scanf("%d%d",&n,&m);
for(i=1;i<=n-1;i++)
{
p=(struct list*)malloc(sizeof(struct list));
p->shu=i+1;
p->next=NULL;
q->next=p;
q=p;
}
q->next=head;
head->shu=1;
p=head;
n--;
while(n--)
{
for(i=0;i<m-1-1;i++)
p=p->next;
p->next=p->next->next;
p=p->next ;
}
printf("%d",p->shu);
return 0;
}
两种方法链表看起来更容易理解一点,而数组看起来更加的精炼。但是数组会有越界的可能性,所以稳定性没有链表的好。 

以后如果遇到类似的问题。尽量用链表。