约瑟夫问题算法

约瑟夫问题:

N个人围成圆圈,从1开始报数,到第M个人令其出列,然后下一个人继续从1开始报数,到第M个人令其出列,如此下去,直到只剩一个人为止。显示最后一个人为剩者。

  1. /*       约瑟夫环
  2.           by zzr
  3. http://blog.csdn.net/ZhengZhiRen/   */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. typedef   struct  node
  7. {
  8.      int  i;
  9.      struct  node *next;
  10. }node;
  11. void  fun(node *p, int  i)
  12. {
  13.      int  count=1;
  14.     node *q;
  15.     q=p;
  16.      /*使q指向p之前的结点*/
  17.      while (q->next!=p)
  18.         q=q->next;  
  19.      /*出圈*/
  20.      while (p->next!=p)
  21.     {
  22.          if (count%i==0)
  23.         {
  24.             q->next=p->next;
  25.             printf( "%d " ,p->i);
  26.             free(p);
  27.         }
  28.          else
  29.             q=q->next;
  30.         p=q->next;
  31.         count++;
  32.     }
  33.     printf( "%d/n" ,q->i);
  34. }
  35. void  main()
  36. {
  37.      int  i;
  38.      int  num;
  39.     node *circle;
  40.     node *p;
  41.     node *q;
  42.     printf( "please input number:/n" );
  43.     scanf( "%d" ,&num);
  44.      /*初始化循环链表*/
  45.     circle=(node*)malloc( sizeof (node));
  46.     circle->i=1;
  47.     circle->next=circle;
  48.     p=circle;
  49.      for (i=2;i<=100;i++)
  50.     {
  51.         q=(node*)malloc( sizeof (node));
  52.         q->i=i;
  53.         q->next=p->next;
  54.         p->next=q;
  55.         p=p->next;
  56.     }
  57.     fun(circle,num);
  58. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值