约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(struct Node)
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;
struct Node
{
ElementType num;
Position Next;
};
List Creat()
{
List L;
L=malloc(len);
L->Next=NULL;
return L;
}
int main()
{
int N,M;
while(scanf("%d %d",&N,&M)!=EOF)
{
int i,flag=1,n=0;
List L;
Position P1,P2;
Position Pre,T,P;
L=Creat();
L->Next=L;
P1=L;
P1->num=1;
for(i=1;i<N;i++)
{
P2=malloc(len);
P2->num=i+1;
P1->Next=P2;
P1=P2;
}
P1->Next=L;
Pre=P1;
T=L;
P=L->Next;
while(1)
{
if(n==N-1)
break;
if(flag==M)
{
printf("%d ",T->num);
free(T);
T=P;
Pre->Next=T;
P=T->Next;
flag=1;
n++;
}
else
{
flag++;
Pre=T;
T=P;
P=T->Next;
}
}
printf("%d\n",T->num);
}
return 0;
};