约瑟夫环加强版--For初学者
经典的约瑟夫问题,click here,本文是加强版的,问题是这样的,n个人围成一圈,每一个人手里拿着一个纸条,每一个纸条上面写着一个数字(我们假设在1~100之间),首先,给出一个数,从第k个人开始报数,淘汰一个人,淘汰的人打开手里的纸条,从他下一个开始报数,直到报数到纸条上的数,依次进行直到剩余一人。
本文的代码注释不多,如果有看不太懂的读者,那么点击这里。本人能力有限,难免有bug,编译环境为Code::Blocks,如有疑问,请留言。
代码如下:
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct node
{
ElemType data;
ElemType nextdata;//记录淘汰人手里的号码
struct node *next;
}LNode;
void Josephus(ElemType n,ElemType m,ElemType k)
{
srand(time( NULL ));
LNode *q,*p;
ElemType i,elem;
p=(LNode *)malloc(sizeof(LNode));
q=p;
for(i=1;i<n;i++)
{
q->data=k;
q->nextdata=1 + (rand()%100);//随机生成1~100的数字
printf("第%d个人,手里的号码:",k);
printf("%d\n",q->nextdata);
k=k%n+1;
q->next=(LNode *)malloc(sizeof(LNode));
q=q->next;
}
q->data=k;
q->nextdata=1 + (rand()%100);
printf("第%d个人,手里的号码:",k);
printf("%d\n",q->nextdata);
q->next=p;
printf("依次淘汰的人\n");
elem=m;//最开始淘汰的人是给定的数
while(p->next!=p)
{
for(i=1;i<elem;i++)
{
q=p;
p=p->next;
}
q->next=p->next;
printf("%4d",p->data);
elem=p->nextdata;//淘汰一个人,把他手里的号码记录下来
free(p);
p=q->next;
}
printf("\n剩的最后一人\n");
printf("%4d",p->data);
}
ElemType main()
{
ElemType n,k,m;
printf("输入人数n,开始的报数m,开始的人k\n");
scanf("%d%d%d",&n,&m,&k);
Josephus(n,m,k);
return 0;
}
我把每个人手里的数字用随机数生成。
运行结果如下: