约瑟夫环问题
来源:互联网 发布:js常用函数 编辑:程序博客网 时间:2024/04/28 08:00
约瑟夫(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序应为6,1,4,7,2,3,5)。
源程序:
# include <stdio.h>
# include <malloc.h>
typedef struct node{
int num; /*用于存放该人的号码数*/
int data; /*用于存放该人的密码值*/
struct node *next;
}jos;
main()
{
int i,j,m;
jos *p,*s,*t;/*p为指向前一个节点的指针,s为生成节点的指针,t为指向第一个节点的指针*/
if((s=(jos*)malloc(sizeof(jos)))==NULL)
{
printf("分配节点出错/n");
return 0;
}
s->num=1;
printf("请输入第1个节点的m值/n");
scanf("%d",&s->data);
p=s;
t=s;
for(i=2;i<=7;i++) /*输入初始的7个人的密码值*/
{
if((s=(jos*)malloc(sizeof(jos)))==NULL)
{
printf("分配节点出错/n");
return 0;
}
p->next=s;
s->num=i;
printf("请输入第%d个人的密码值/n",i);
scanf("%d",&s->data);
s->next=NULL;
p=s;
}
p->next=t;
m=6;
for(i=1;i<=7;i++) /*用于计数,共搜索7次*/
{
for(j=1;j<=m-1;j++) /*查找要删除的节点*/
{
p=p->next;
}/*此时p指向要删除的节点的前一个节点*/
printf("第%d次出局的人是%d/n",i,p->next->num);
m=p->next->data;
p->next=p->next->next;
}
}
- 约瑟夫问题、约瑟夫环
- Josephus约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题(Josephus)
- 约瑟夫环问题--java
- 约瑟夫环问题 Josephus
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 求解约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 约瑟夫环问题
- 天空之城_百度百科
- ArraysMethodDemo2.java
- 在Delphi中的Access技巧集
- CSS网站布局技巧几则
- 一些好的学习网址
- 约瑟夫环问题
- 一位软件工程师的6年总结
- ReactOS名称的由来
- 初探QQ空间本地安全问题!
- ramdisk
- IBatis教程
- C#基础概念二十五问
- CA证书常识
- 亲历5.12大地震