约瑟夫类问题

17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,
必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,
每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。


实现代码:

#include <stdio.h>
#include <malloc.h>
 typedef struct Huan
 {
     int a;
     struct Huan * next;
 }H;
 H * creat(int n)
 {
     H * p , * q , * head;
     head = (H *)malloc(sizeof(H));
     p = head;
     int i = 1;
     if( 0 != n )
     {
         while( i <= n )
         {
             q = (H *)malloc(sizeof(H));
             q->a = i ++;
             p->next = q;
             p = q;
        }
        q->next = head->next;
    }
    free(head);
    return q->next;
 }
 int main()
 {
     H * p , * temp ;
     p = creat(30);
     while( p != p->next )
     {
         for(int i=0;i<8;i++)
         {
             p = p->next;
        }
        printf("%d-->",p->next->a);
        temp = p->next;
        p->next = temp->next;
        free(temp);
        p = p->next;
    }
    printf("%d",p->a);
    return 0;
 }


 

 由代码可得:

10-->20-->30-->11-->22-->3-->15-->27-->9-->24-->7-->23-->8-->26-->14-->2-->21

-->16-->6-->4-->1-->5-->13-->19-->12-->29-->18-->25-->17-->28


由上述可知:

将教徒放在2-->21-->16-->6-->4-->1-->5-->13-->19-->12-->29-->18-->25-->17-->28位置上,可以保证每次投入大海的都是非教徒。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值