约瑟夫问题 Objective-C

2021-11-07  本文已影响0人  long弟弟

约瑟夫问题简介

39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

Objective-C语言实现

    //创建包含1~41的数组
    NSMutableArray *array = [NSMutableArray array];
    for (NSInteger i = 1; i <= 41; i++) {
        [array addObject:@(i)];
    }
    
    //从"1"开始数,第0个位置
    NSInteger j = [array indexOfObject:@(1)];
    //1、2、3、1、2、3...的开始数
    for (NSInteger i = 1; i <= 3; i++, j++) {
        //从头开始数
        if (j > array.count - 1) {
            j = 0;
        }
        NSLog(@"数到%ld:位置%ld", i, j);
        if (i == 3) {
            i = 0; //i++自动加1,保证继续数数
            //移除:数到3,等于3就移除
            //NSLog(@"移除:%@", [array objectAtIndex:j]);
            [array removeObject:[array objectAtIndex:j]];
            j--; //删除之后更新现在的位置
            
            //剩余约瑟夫和他的朋友
            if (array.count <= 2) {
                NSLog(@"剩下:%@", array);
                return;
            }
        }
    }

理解j--
1 2 3 4 5 6 7 8 9 10 ...
1 2 3 1 2 3数数
0 1 2 位置
将3删除
1 2 4 5 6 7 8 9 10 ...
0 1 2 位置
4就变成在数组的第2个位置上

输出结果:

剩下:(
    16,
    31
)
上一篇下一篇

猜你喜欢

热点阅读