如何修复超过 1 分钟规则的 Collat​​z 序列代码?

How to fix my Collatz sequence code that exceeds the 1-minute rule?

总结

大家好。我正在尝试解决一个与 Collat​​z 猜想相关的相对简单的问题。

首先问题如下:

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.

来源:https://projecteuler.net/problem=14

一个简短的脚注

最初,我确实遇到了变量溢出并变为负值的问题。虽然,正如我提到的,我通过使用 unsigned long long 解决了这个问题。

代码

#include <iostream>
using namespace std;

int collatz(long long n) {
 if (n%2 == 0) return n/2;
 return 3*n+1;
}

int main() {
    unsigned long long cnt, n, maxcnt=0, num;
    for(int i=1; i<1000000; i++) {
        cnt=1;
        n=i;
        while(n != 1) {
            n=collatz(n);
            cnt++;
        }
        if(cnt>maxcnt) {
            maxcnt=cnt;
            num=i;
        }
    }
    cout<<num;
    return 0;
}

结果

它没有得到 任何 结果,而是以无限循环结束。

好吧,如果你的函数 returns 是一个整数,你并没有真正解决问题的一部分,我想这应该可以

unsigned long long collatz(unsigned long long n)