约瑟夫环的数组实现 __ 经典思考题原创解法.

题目: 

约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元66-70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名将士在附近的一个洞穴中避难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签并且做为洞穴中两个幸存者之一生存下来。

约瑟夫环问题的具体描述是:

设有编号为12......nn(n>0)个人围成一个圈,从第一个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,......,如此下去,直到只剩下一人为止。当任意给定 n m后,设计算法求 n个人出圈的次序。

代码如下:

#import <Foundation/Foundation.h>
//<span style="font-family: Arial, Helvetica, sans-serif;">SIZEONE  为数组大小 ,也就是存放一共有几个人, </span>
//M为喊数字几就死一个人, 这里定义为3  也就是每当喊道 3 的那个人就死亡.

#define SIZEONE 5
#define M 3

int main(int argc, const char * argv[])
{   
     //数组初始化为1. 1代表此人活着. 0代表此人已死.
    int a[SIZEONE] = {1,1,1,1,1};
    int count = SIZEONE , panduan = 1 , i = 1 ,j = 0;
    while( count  != 1)
    {
        
        
        panduan = 1;
        if( a[j % SIZEONE] == 1)
        {
            
            if(i % M == 0)
            {
                a[j % SIZEONE] = 0;
                printf("%d  ",j % SIZEONE);
                count --;
                j++;
                i = 1;
            }
            else
            {
                i++;
                j++;
            }
        }
        else
        {
            while ( panduan  )
            {
                
                if( a[j % SIZEONE] == 1)
                {
                    if(i % M == 0)
                    {
                        a[j % SIZEONE] = 0;
                        printf("%d  ",j % SIZEONE);
                        count --;
                        i = 1;
                        j++;
                        panduan = 0;
                        
                    }
                    else
                    {
                        i++;
                        j++;
                        panduan = 0;
                    }
                    
                }
                else
                {
                    
                    j++;
                    
                }
            }
        }
        
        
    }
    
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值