约瑟夫环问题

原创 2011年01月12日 21:44:00

约瑟夫环问题

约瑟夫问题的一种描述为:编号1,2,…,nn个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。

例如m的初值为20n=77个人的密码依次是:3,1,7,2,4,8,4,出列顺序为6,1,4,7,2,3,5

算法如下:

#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
 int Passwd;
 int num;
 struct Node *next;
}Node,*linklist;
void main()
{
 linklist L;/*指向struct类型得指针L*/
 Node *p,*q,*r;/*Node 相当于struct Node*/
 int m,n,i,j,c;
 L=(Node*)malloc(sizeof(Node));/*L作为头结点*/
 if(L==NULL){printf("/n 链表申请不到空间");return;}
 L->next=NULL;/*刚开始L->next为空指针*/
 r=L;/*r刚开始指向头结点地址*/
    printf("请输入数据n的值(n>0):");
 scanf("%d",&n);
  
    for(i=1;i<=n;i++)
 {  
  p=(Node*)malloc(sizeof(Node));/*开始为每n个节点分配地址空间*/
      
  if(p!=NULL)
  {
          printf("请输入第%d个人的密码:",i);
          scanf("%d",&c);
          p->Passwd=c;
    p->num=i;
    r->next=p;/*因为刚开始r=L,所以L->next指向为第一个节点*/
    r=p;/*r移动到刚分配好的地址*/
  }
 }
    r->next=L->next;/*单向循环链表特点是最后一个节点指针域指向第一个节点,语句完成此功能*/
 printf("请输入第一个报数上限值m(m>0):");
 scanf("%d",&m);
 p=L;/*头结点地址*/
 q=L->next;/*指向第一个节点的指针*/
 while(n!=1)
 {
  i=1;
 while(i<m)
 {
       
  p=q;/*当前节点为q,p为前驱节点*/
  q=q->next;/*q移动到q->next*/
  i++;
 }
    printf("%d->",q->num);
 m=q->Passwd;
 n--;
 p->next=q->next;/*q出列所以指向为q->next*/
 r=q;/*r移动到q*/
 q=q->next;/*q移动到q->next*/
 free(r);
}
printf("%d",p->num);/*当n==1时跳出循环,结束程序*/
}

10行Python代码解决约瑟夫环(模拟)

写这篇文章是因为看到别人博客里用了很长一个篇幅(超过50行)去解决一个约瑟夫环问题,而且还是用以简洁著称的python,另外,如果你用X度搜索python 约瑟夫,看到得前几条都是错的,真是好悲剧。 ...
  • u011044759
  • u011044759
  • 2014年09月11日 17:21
  • 30607

Java实现约瑟夫环问题

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;...
  • qq_21150865
  • qq_21150865
  • 2017年03月05日 14:48
  • 4484

约瑟夫环的问题编程C++实现

已知 n 个人(以编号1, 2, 3 ,4, 5 ,6  ... .. .n)围坐一张圆桌周围。从编号为k 的人开始报数,数到m 的那个人出列;他的下一个人又从 1开始报数,数到m的那个人又出列;依次...
  • Eagleest
  • Eagleest
  • 2012年10月19日 21:57
  • 16158

PHP篇之二个函数解决约瑟夫环问题

讲故事了! 约瑟夫环问题起源于一个犹太故事。:   罗马人攻占了桥塔帕特,41个人藏在一个山洞中躲过了这场浩劫。这41个人中,包括历史学家Josephus(约瑟夫)和他的一个朋友。剩余的39个人为...
  • backOrigin
  • backOrigin
  • 2016年12月17日 23:14
  • 990

【c语言】使用数组解决 约瑟夫环问题

由于目前对c语言的学习仅限于数组,指针还不会用。mo'shuo
  • zyb050607
  • zyb050607
  • 2014年07月02日 13:37
  • 3132

约瑟夫环问题python解法

约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到...
  • littlethunder
  • littlethunder
  • 2014年09月10日 16:28
  • 7228

约瑟夫环问题两种情况解答

     约瑟夫环问题主要分两种,    第一种问题的描述是:N个人按顺时针围成一个圈,从1到N,然后报数,报到M的人就出去,然后剩余的人仍然围成一个圈,从出局的人下一个人开始重新报数,到M的人出局,...
  • jianzhibeihang
  • jianzhibeihang
  • 2009年12月06日 21:05
  • 5169

约瑟夫环问题的几种解法

一、问题的来历     据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲在一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于...
  • ltxiaobing
  • ltxiaobing
  • 2015年12月27日 14:55
  • 1240

约瑟夫环 python 实现

面试的过程中遇到了这个问题。就是经典的约瑟夫环。
  • u012250655
  • u012250655
  • 2014年07月28日 00:43
  • 1715

约瑟夫环——公式法(递推公式)

约瑟夫问题约瑟夫问题是个有名的问题:N个人围成一圈,第一个从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。 例如只有三个个人,把他们叫做A、B、C围成一...
  • u011500062
  • u011500062
  • 2017年06月04日 01:02
  • 2442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环问题
举报原因:
原因补充:

(最多只允许输入30个字)