救救约瑟夫和他的朋友

题目描述:

在罗马人占领乔塔帕特后,N个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,N + 2个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?

输入描述: 

第一行正整数N(0 < N <= 111111)表示共有N个犹太人(所以加上约瑟夫和他的朋友一共有N+2个人)。

输出描述:

请你告诉约瑟夫和他的朋友,他们在圆圈中的什么位置能够活下来。
输出格式为: 剩下两个人为第I个和第J个。

输入例子:

39

输出例子: 

剩下两个人为第16个和第31个

AC代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42449444/article/details/84444765