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。

  • 相关阅读:
    a链接获取方法
    调用百度地图API搜索地名和关键词
    页面定时跳转
    amazeui 上传文件
    数组删除多个元素的方法
    synology git 服务器问题处理
    公司和家里代码文件同步方案: (git和dropbox实现)
    前端项目, 每次运行都需要输入 sudo 的解决方法
    git revert 让提交不再害怕
    建立自己的键盘栈(shortcutkeyStack)
  • 原文地址:https://www.cnblogs.com/quanjun/p/12327806.html
Copyright © 2011-2022 走看看