zoukankan      html  css  js  c++  java
  • 欧拉计划第14题题解

    Longest Collatz sequence

    The following iterative sequence is defined for the set of positive integers:

    n → n/2 (n is even)
    n → 3n + 1 (n is odd)

    Using the rule above and starting with 13, we generate the following sequence:

    13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

    It can be seen that this sequence (starting at 13 and finishing at 1) contains 10 terms. Although it has not been proved yet (Collatz Problem), it is thought that all starting numbers finish at 1.

    Which starting number, under one million, produces the longest chain?

    NOTE: Once the chain starts the terms are allowed to go above one million.

    最长考拉兹序列

    在正整数集上定义如下的迭代序列:

    n → n/2 (若n为偶数)
    n → 3n + 1 (若n为奇数)

    从13开始应用上述规则,我们可以生成如下的序列:

    13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

    可以看出这个序列(从13开始到1结束)共有10项。尽管还没有被证明,但我们普遍认为,从任何数开始最终都能迭代至1(“考拉兹猜想”)。

    从小于一百万的哪个数开始,能够生成最长的序列呢?

    注: 序列开始生成后允许其中的项超过一百万。

    解题思路

    本来想记忆化搜索,但是感觉数的范围不能确定。
    所以直接就用递归实现了。
    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 55;
    int f(long long n) {    // 返回经过多少次变成1
        if (n == 1) return 1;
        if (n%2) return 1 + f(3*n+1);
        else 1 + f(n/2);
    }
    void output(long long n) {  // 输出变化方案
        if (n == 1) {
            cout << n << endl;
            return;
        }
        cout << n << " → ";
        if (n%2) output(3*n+1);
        else output(n/2);
    }
    int main() {
        int n = 0, ans = 0;
        for (int i = 1; i < 1000000; i ++) {
            int tmp = f(i);
            if (tmp > ans) {
                n = i;
                ans = tmp;
            }
        }
        cout << n << " , " << ans << endl;
        // output(n);
        return 0;
    }
    

    100万之内最小的数字是 837799 , 它一共经历了 196 次才变成 1。

  • 相关阅读:
    fork安全的gettid高效实现
    TCP_DEFER_ACCEPT的坑
    TCP Linger的坑
    Blade和其他构建工具有什么不同
    在Blade中结合gperftools检查内存泄露
    GraphViz web版
    用户场景分析
    java-二维数组——with 刘童格
    java-四则运算-五-网页版--with刘童格
    java-四则运算-四
  • 原文地址:https://www.cnblogs.com/quanjun/p/12327806.html
Copyright © 2011-2022 走看看