最长考拉兹序列
在正整数集上定义如下的迭代序列:
n → n/2 (若n为偶数)
n → 3n + 1 (若n为奇数)
从13开始应用上述规则,我们可以生成如下的序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
可以看出这个序列(从13开始到1结束)共有10项。尽管还没有被证明,但我们普遍认为,从任何数开始最终都能迭代至1(“考拉兹猜想”)。
从小于一百万的哪个数开始,能够生成最长的序列呢?
注: 序列开始生成后允许其中的项超过一百万。
C代码演示
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
#define MAX_KEEP_SIZE 10000000
int f[MAX_KEEP_SIZE + 5];
int get_chain_length(long long x) {
if (x == 1) return 1;
if (x <= MAX_KEEP_SIZE && f[x] != 0) return f[x];
int ret;
if (x & 1) ret = get_chain_length(3 * x + 1) + 1;
else ret = get_chain_length(x / 2) + 1;
if (x <= MAX_KEEP_SIZE) f[x] = ret;
return ret;
}
int main() {
int max_len = 0, num = 0;
for (int i = 1; i < 1000000; i++) {
int l = get_chain_length(i);
if (l > max_len) max_len = l, num = i;
}
cout << num << " " << max_len << endl;
return 0;
}