/* 约瑟夫问题 犹太人有这样的故事:罗马人占领乔塔帕特后,39个犹太人与约瑟夫及他的朋友躲到一个洞里,犹太人决定宁愿死也不要被敌人逮到,于是决定了一个自杀方式,41个人排成一个圈,由第1个人开始报数,每报数到第3个,该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。 现在假设您不幸参与了这个游戏,共有N个人,如何让自己成为最后一个报数者,成功逃生。假设有41个人,您需要排在多少位才能逃生。 */ int confirmLastOne(int sum) { int a[sum]; for (int i = 0; i < sum; i++) { a[i] = 1; } int idioctoniaCount = 0; // 自杀人数 int idioctoniaCountFlag = 0; // 报数自杀标志 int flag = 0; // 轮圈标志 while (idioctoniaCount < sum - 1) { if (a[flag] == 1) { idioctoniaCountFlag++; if (idioctoniaCountFlag % 3) { a[flag] = 0; idioctoniaCount++; } } flag++; if (flag == sum + 1) { flag = 0; } } for (int i = 0; i < sum; i++) { if (a[i] == 1) { return i + 1; } } return0; }