josephus问题
问题描述:
设有N个人围坐在一个圆桌的周围,现从第s个人开始报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列。。。如此反复,直到所有人出列。
选自算法与数据结构——C语言描述第三版。张乃孝。
书中给的代码,比较繁杂且使用了ADT的一些函数,我自己上机写了对应的顺序表与链表的代码,经自测无误,上传代码,以供网友参考。
**注:**代码直接复制粘贴可运行,为方便调试加上while(1);如果在linkcode等网站刷题,应去掉while(1),编号从1~n,数组不使用a【0】。
编译环境:dev-c++ 编译语言:C语言
顺序表
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,m,i,curr = 1,count= 0;
int a[999] = {0}; //a[curr] = 0表示curr再表里 1表示不在表里
printf("please input total number n and step lenth m\n");
scanf("%d%d",&n,&m);
for(i= 0;i<n;i++)
{
while(count<m) //若a【curr】在数组中,则记步数,否则不计
{
if(a[curr] == 0)count++;
curr = curr%n;
curr++;
}
curr--; //使curr表示当前序号
count= 0;
if(curr)
{
printf("%d\n",curr);
a[curr] = 1;
}
else
{
printf("%d\n",n);
a[n] = 1;
}
curr++; //补偿curr使之满足循环
}
while(1);
return 0;
}
链表
#include <stdio.h>
#include <stdlib.h>
typedef struct Node* Link;
typedef struct Node{
int Num;
Link Next;
}node;
int main()
{
int n ,m,i,j;
printf("please input total number n and step lenth m\n");
scanf("%d%d",&n,&m);
printf("n is %d,m is %d\n",n,m);
Link curr = (Link)malloc((sizeof(struct Node)));
Link head = (Link)malloc((sizeof(struct Node)));
Link rear = (Link)malloc((sizeof(struct Node)));
Link pre = (Link)malloc((sizeof(struct Node)));
curr = head;
head->Num = 1;
head->Next = NULL;
for(i=2;i<=n;i++) //初始化链表
{
Link node = (Link)malloc((sizeof(struct Node)));
node->Num = i;
node->Next = NULL;
if(i==2)head->Next = node;
curr ->Next = node;
curr = node;
}
curr->Next = head;
rear = curr;
for(i= 0;i<n;i++)
{
for(j=0;j<m;j++)
{
pre = curr;
curr = curr->Next;
}
printf("%d\n",curr->Num);
pre->Next = curr->Next;
Link tmp = curr;
free(tmp);
curr = pre;
}
printf("in the end of code");
while(1);
return(0);
}