约瑟夫问题简介
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
)
网友评论