问题 1047: [编程入门]报数问题 本质是约瑟夫死环

Posted wildness-priest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 1047: [编程入门]报数问题 本质是约瑟夫死环相关的知识,希望对你有一定的参考价值。

时间限制: 1Sec 内存限制: 128MB 提交: 3216 解决: 1753

题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int sum=n;
    int array[1000];
    //数组下标全置1,到时候我只用1~n这n个位置,定义一个表示1个数的变量sum,出局就置零,同时sum-1 
    //当sum等于1,表示只剩一个人时,跳出循环,然后遍历数组找出未出局的那个人 
    for(int i=1;i<=n;i++)
    {
        array[i]=1;
    }
    int pos=1;
    for(int j=1;1;j++)
    {
        if(j%3==0)//只要j长到了3的倍数,就会使本次循环中的array[pos]置0 
        {//判断对3取余等于0(就相当于一直在做每3个数一次的循环)
            array[pos]=0;
            sum--;
        }
        if(sum==1)
        {
            break;
        } 
        pos++;
        if(pos>n)//当 指针pos转了一圈,发现自己出界了,赶紧从头开始;注意!pos >n才表示出界 
        {
            pos=1;
        }
        while(1)//这个循环的目的是使得参选那个3次一循环的array[]必须是未出局的 
        {
            if(array[pos]==0)
            {
                pos++;
                if(pos==n+1)
                {
                    pos=1;
                }
            }
            else
            {
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(array[i]==1)
        {
            cout<<i;
            break;
        }
    }
    return 0;
}

 

以上是关于问题 1047: [编程入门]报数问题 本质是约瑟夫死环的主要内容,如果未能解决你的问题,请参考以下文章

用Java编程解决韩信点兵的问题?

入门OJ1047:字符图形3-平行四边形

C语言,韩信点兵编程,看看我的错在哪?

PAT 乙级 1047 编程团体赛

1047. 编程团体赛(20)

1047. 编程团体赛(20)