版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/84444765
在罗马人占领乔塔帕特后,N个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,N + 2个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?
第一行正整数N(0 < N <= 111111)表示共有N个犹太人(所以加上约瑟夫和他的朋友一共有N+2个人)。
请你告诉约瑟夫和他的朋友,他们在圆圈中的什么位置能够活下来。 输出格式为: 剩下两个人为第I个和第J个。
39
剩下两个人为第16个和第31个
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, LEN;
cin >> n;
LEN = n + 2;
int a[LEN];
for(int i=0;i<LEN;i++)
{
a[i] = 1; // 数组初始化,1:表示为活着;0:表示自杀;
}
int leftCount = LEN; // 计数器leftCount:计数剩下的人
int index = 0,count = 0; // 1.数组下标index;2.循环计数器count
while(leftCount>2) // 当还剩下两个人时
{
if(a[index] == 1)
{
count++;
if(count == 3) //计数到3,1.自杀;2.循环计数器count重新开始计数;3.计数器leftCount减1
{
a[index] = 0;
count = 0;
leftCount--;
}
}
index++;
if(index == LEN)
{
index = 0;
} // 当到数组尾,数组下标index置零,重新开始
}
int c = 0,b[2];
for(int j = 0; j < LEN; j++) //输出结果
{
if(a[j] == 1)
{
b[c] = j+1;
c++;
}
}
printf("剩下两个人为第%d个和第%d个",b[0],b[1]);
return 0;
}