据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
约瑟夫问题是典型的循环链,但也可用数组实现。
static void Jproblem(int n, int k)
{
int[] array = new int[n];
Console.WriteLine("initial the array");
for (int j = 0; j < n; j++)
{
array[j] = 1;
}
bool end = false;
int i = 1;
int currentPostion = 0;
while (!end)
{
if (array[currentPostion] == 1)
{
i++;
}
if (currentPostion == n - 1) // if max, then go to 0
{
currentPostion = 0;
}
else
{
currentPostion++;
}
if (i > k)
{
array[currentPostion] = 0;//delete it
i = 1;
}
// sum
int sum = 0;
foreach (int a in array) // 如何sum小于K,说明程序应该结束了
{
sum += a;
}
if (sum < k)
{
end = true;
}
}
for (int j = 0; j < n; j++)
{
if (array[j] == 1)
{
Console.WriteLine(j);
}
}