欧拉计划第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 
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。

你可能感兴趣的:(欧拉计划第14题题解)