美文网首页
1001害死人不偿命的(3n + 1)猜想

1001害死人不偿命的(3n + 1)猜想

作者: advanced_slowly | 来源:发表于2019-08-08 21:30 被阅读0次

    卡拉兹猜想:对任何一个正整数n,如果它是偶数,那么它砍掉一半;如果是奇数那么(3n+1)砍掉一半。这样一直反复砍下去,最后直到某步达到n=1。卡拉兹在1950年的世界数学大会发布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹的学生们无心作业,一心只证3n+1,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的发展......我们今天的题目不是证明卡拉兹猜想而是对给定的任一不超过的正整数n,简单的数一下需要多少步才能得到n=1?我们今天是听这个故事的(滑稽),卡拉兹心里:你们是在羡慕我的智慧嘛。

    这题简单,就来扩展下思维吧。
    1.递归求解,牺牲多点空间

    #include <iostream>
    
    void  countNumber(int number,int& counter)
    {
        if(number == 1)
        {
            return;
        }
    
        if((number % 2) == 0)
        {
            counter++;
            countNumber(number * 1 / 2,counter);
        }
        else
        {
            counter++;
            countNumber((3 * number + 1) * 1 / 2,counter);
        }
    }
    
    int main()
    {
        int number = 0;
    
        std::cin >> number;
        int counter = 0;
        countNumber(number,counter);
    
        std::cout << counter << std::endl;
    
        return 0;
    }
    

    2.常规解法

    #include <iostream>
    
    int countNumber(int number)
    {
        int counter = 0;
        if(number > 1000)
        {
            return -1;
        }
        while(number != 1)
        {
            if((number % 2) == 0)
            {
                int temp = number * 1 / 2;
                number = temp;
            }
            else
            {
                int temp = (3 * number + 1) * 1 / 2;
                number = temp;
            }
            
            counter++;
        }
        return counter;
    }
    
    int main()
    {
        int number = 0;
    
        std::cin >> number;
        std::cout << countNumber(number) << std::endl;
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:1001害死人不偿命的(3n + 1)猜想

          本文链接:https://www.haomeiwen.com/subject/kuifjctx.html