说明 据说着名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中 , 39个犹太人决定宁愿死也不要被敌人到 , 于是决定了
一个自杀方式,41个人排成一个圆圈,由第1个人 开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
C代码
#include<stdio.h>#include<stdlib.h>#define N 41int 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=41def 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 passif __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