说明 据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中 , 39个犹太人决定宁愿死也不要被敌人到 , 于是决定了
一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
C代码
#include<stdio.h>
#include<stdlib.h>
#define N 41
int main()
{
int man[N] = { 0 };
int count = 1; //第count个自杀的人
int pos = 0;
int i = 0;
while (count <= N)
{
do
{
pos = pos % N; //环状处理(如第pos=42时,42%41=1,即重回到索引为1的位置
if (man[pos] == 0)
{
i++;
}
if (i == 3)//数到三自杀
{
i = 0;
break;
}
pos++;
} while (1);
man[pos] = count; //第i个位置表示第count自杀的人
count++; //下一个自杀的人
}
printf("约瑟夫排列:\n");
for (int i = 0; i < N; i++)
{
printf("%d ", man[i]);
}
int num;
printf("\n请输入你想救的人数:");
scanf_s("%d", &num);
for (int i = 0; i < N; i++)
{
//1表示想救的人所在的位置
if (man[i] <= N - num)
printf("0 ");
else
printf("1 ");
if ((i+1) % 5 == 0)
printf(" ");
}
system("pause");
return0;
}
python
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 21 19:48:05 2017
@author: yangwenbin
"""
N=41
def Josephus(man):
count=1
pos=0
i=0
while count<=N:
while 1:
pos=pos%N #环形处理
if man[pos]==0:
i=i+1
pass
if i==3:
i=0
break
pos+=1
pass
man[pos]=count
count+=1
pass
pass
if __name__=="__main__":
man=[0]*N
Josephus(man)
print(man)
num=input("请输入你想救的人数:")
for i in range(N):
if man[i]<=(N-int(num)):
print("0 ",end='')
pass
else:
print("1 ",end='')
pass
if (i+1)%5==0:
print(" ",end='')
pass
pass
pass