据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
故事还原:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 约瑟夫环问题 { public class Josephusring { public static int nums { get; set; } = 41; public static int[] people = new int[nums]; private static int outpeople = 3; static void Main(string[] args) { Console.WriteLine("约瑟夫环问题:\n"+ "据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus和他的朋友并不想遵从。他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。"); Josephusring j = new Josephusring(); j.InitJosephusRing(); j.Printf_Ring(); int left = nums; int counter = 0; int i = 0; while (true) { if (people[i] > 0) { counter++; } if (counter == outpeople) { left--; Console.WriteLine(people[i] + "号出局了!\n\n"); Console.WriteLine("\n\n"); people[i] = 0; counter = 0; } if (people[i]!=0) { Console.WriteLine("当前总人数" + left + "\t" + "当前报数者:" + (i + 1) + "\n"); } j.Printf_Ring(); if (left <= 2) { break; } i++; if (i == nums) { i = 0; } } Console.WriteLine("Gameover!!!"); } public void InitJosephusRing() { for (int i = 0; i < nums; i++) { people[i] = i + 1; } } public void Printf_Ring() { for (int i = 0; i < nums; i++) { Console.Write("\t[" + people[i] + "]" ); } Console.WriteLine(); } } }
故事完毕!
原文:https://www.cnblogs.com/fenqinearl/p/10910441.html