1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/20 13:53:38
![1、编写程序,模拟约瑟夫环(josephus)问题:n个人(编号为1,2,3,……,n (n>0) )按顺时针方向围坐一圈,每人持有一个正整数密码.开始时任意给出两个值:一个为首先报数的人的编号i (0](/uploads/image/z/14881006-46-6.jpg?t=1%E3%80%81%E7%BC%96%E5%86%99%E7%A8%8B%E5%BA%8F%2C%E6%A8%A1%E6%8B%9F%E7%BA%A6%E7%91%9F%E5%A4%AB%E7%8E%AF%EF%BC%88josephus%EF%BC%89%E9%97%AE%E9%A2%98%EF%BC%9An%E4%B8%AA%E4%BA%BA%EF%BC%88%E7%BC%96%E5%8F%B7%E4%B8%BA1%2C2%2C3%2C%E2%80%A6%E2%80%A6%2Cn+%28n%3E0%29+%EF%BC%89%E6%8C%89%E9%A1%BA%E6%97%B6%E9%92%88%E6%96%B9%E5%90%91%E5%9B%B4%E5%9D%90%E4%B8%80%E5%9C%88%2C%E6%AF%8F%E4%BA%BA%E6%8C%81%E6%9C%89%E4%B8%80%E4%B8%AA%E6%AD%A3%E6%95%B4%E6%95%B0%E5%AF%86%E7%A0%81.%E5%BC%80%E5%A7%8B%E6%97%B6%E4%BB%BB%E6%84%8F%E7%BB%99%E5%87%BA%E4%B8%A4%E4%B8%AA%E5%80%BC%EF%BC%9A%E4%B8%80%E4%B8%AA%E4%B8%BA%E9%A6%96%E5%85%88%E6%8A%A5%E6%95%B0%E7%9A%84%E4%BA%BA%E7%9A%84%E7%BC%96%E5%8F%B7i+%280)
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