//约瑟夫环的数组实现 约瑟夫(Josephus)问题是由古罗马的史学家约瑟夫提出的,他参加并记录了公元 66-70 年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达 伯特城达 47 天之久,在城市沦陷之后,他和 40 名将士在附近的一个洞穴中避难。在哪里,将士们群情激奋并表示:要投降毋宁死。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签并且做为洞穴中两个幸存者之一生存下来。约瑟夫环问题的具体描述是:设有编号为 1,2,......,n 的 n(n>0)个人围成一 个圈,从第一个人开始报数,报到 m 时停止报数,报 m 的人出圈,再从他的 下一个人起重新报数,报到 m 时停止报数,报 m 的出圈,......,如此下去,知 道只剩下一人为止。当任意给定 n 和 m 后,设计算法求 n 个人出圈的次序。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
int n = 10;//总人数
int m = 3;//周期
int status[10] = {0};//状态数组 初始值都为0,即都生存
int count = 0;//死亡人数
int number = 1;//当前报数的人 从1~10
int i = 0;//下标
while (count < 10)//死亡人数小于总人数 否则跳出循环
{
if (status[i] == 0)
{
//状态为生存 则查看报数人是否正好数到周期数3
if (number != 3) {
number++;//下一个人报数
i++;//状态下标后移
if (i >=10) {
i = 0;//如果下标越界 则下标从0开始
}
} else {
status[i] = 1;//状态为1 即死亡
number = 1;//重新开始报数
printf("死亡人下标为:%d\n", i);
count++;//死亡人数加1
i++;//状态下标后移
if (i >= 10) {
i = 0;//如果下标越界 则下标从0开始
}
}
} else {
i++;//状态下标后移
if (i >= 10) {
i = 0;//如果下标越界 则下标从0开始
}
}
}
return 0;
}