Josephus 问题(1)

一、题目

N人围成一个环,每个人一个编号1—n,然后1、2报数,报2出局,其余人继续,直至最后一人。求该人的编号。

二、分析
我们可以用一个一维数组去储存,下标表示编号(0号不用),然后数组值全部赋值为0,报到2者数组值改为1,一直持续,直至最后一个0.

三、算法实现
(主要代码)

 int a[1001]={
    
    0,};
    int flag,n,k,x,i=1;
    while(scanf("%d",&n)!=EOF)
    {
    
    
        if(1==n||2==n)
            x=1;
        else{
    
    
            for(i=1;i<=1000;i++)
                a[i]=0;
                flag=1;//flag模拟报数
            for(k=0;k<=log2(n);k++)//log2(n)趟。
                for(i=1;i<=n;i++)
            {
    
    
                if(a[i]!=-1)
                {
    
    
                    if(flag==2)
                    {
    
    
                        a[i]=-1;
                        flag=0;
                    }
                    flag++;
                }
            }
            for(i=1;i<=n;i=i+2)
                if(a[i]!=-1)
                x=i;
        }
        printf("%d\n",x);

    }

四、算法分析
时间复杂度:根据循环的层数以及循环的变量,可以计算出其时间复杂度为nlogn。
空间复杂度除了一个一维数组为算法本需求身外,只有几个变量。故其空间复杂度为O(1)。

五、小结
此题实际模拟即可,较为简单,但是还是应该注意一些细节,比如走多少趟。

猜你喜欢

转载自blog.csdn.net/King0237/article/details/111174496