Josephus 问题(2)

一、题目

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

二、分析
找规律:我直接写出了n从1—17的最终答案,分别为:1、1、3、1、3、5、7、1、3、5、7、9、11、13、15、1…发现其是以2的幂次方为一个轮回,然后奇数增长。
分开更容易看清:1 1、3 1、3、5、7 1、3、5、7、9、11、13、15
个数刚好为1、2、4、8

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

算法实现如下:
    long long n,m,x;
    while(scanf("%lld",&n)!=EOF)
    {
    
    
        m = log(n)/log(2);计算出有对应位置。
        x=2*(n-pow(2,m))+1;求最终值。
        printf("%lld\n",x);
    }

四、算法分析
此算法为公式计算,故可以得出其时间复杂度为O(1).根据程序,易知空间复杂度为O(1)。 感受数学在编程过程中的无比魅力,数学思维很重要

猜你喜欢

转载自blog.csdn.net/King0237/article/details/111174703
今日推荐