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

时间:2019-02-18 22:27:12

标签: c++ sequence collatz

摘要

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

首先,问题如下:

  

为正整数的集合定义了以下迭代序列:

     

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

     

使用上面的规则并从13开始,我们生成以下序列:

     

13→40→20→10→5→16→8→4→2→1   可以看出,该序列(从13开始到1结束)包含> 10个词。尽管尚未得到证明(Collat​​z问题),但人们认为>所有起始数字都以1结尾。

     

哪个起始编号小于一百万,会产生最长的链条?

     

注意:连锁经营开始后,期限就可以超过一百万。

来源: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;
}

结果

它没有得到任何结果,而是最终陷入了无限循环。

1 个答案:

答案 0 :(得分:0)

好吧,如果您的函数返回一个int,则您并没有真正解决问题,我想这应该可以解决

unsigned long long collatz(unsigned long long n)