1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/25 04:14:09
1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0
1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0
1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0
#include
#include
typedef struct Lnode{
int data;
struct Lnode *next;} Lnode;
Lnode* create(int n)
{//建立共有n个结点的单循环链表h
int i;
Lnode *h,*p;//p为当前新生成结点的指针
Lnode *r=(Lnode *)malloc(sizeof(Lnode));//r为尾指针
r->data=n;h=r;//h为头指针
for(i=n-1;i>0;i--)//头插法建立链表
{p=(Lnode *)malloc(sizeof(Lnode));
p->data=i;
p->next=h;
h=p;
}
r->next=h ; //形成环
return h;
}
void jeseph(Lnode *p,int m)
{//从约瑟夫环中输出出列人的编号
Lnode *q;
int j=0;
printf("出队序列为:\n");
do{
j++;
if (j==m-1)
{
q=p->next;
p->next=q->next;
printf("%d ",q->data);
j=0;free(q);
}
p=p->next;
}while(p->next!=p);
printf("%d\n",p->data);
free(p);
}
void main()
{
Lnode *h;
int m,n;
printf("\n请输入n和m的值:");
scanf("%d,%d",&n,&m);
h=create(n) ;
jeseph(h,m);
}
执行程序结果为:
请输入n和m的值:12 , 4
出队序列为:4,8,12,5,10,3,11,7,6,9,2,1
执行程序结果为:
请输入n和m的值:7,20