大家好。我正在尝试解决一个与Collatz猜想有关的相对简单的问题。
首先,问题如下:
为正整数的集合定义了以下迭代序列:
n→n / 2(n为偶数) n→3n + 1(n为奇数)
使用上面的规则并从13开始,我们生成以下序列:
13→40→20→10→5→16→8→4→2→1 可以看出,该序列(从13开始到1结束)包含> 10个词。尽管尚未得到证明(Collatz问题),但人们认为>所有起始数字都以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;
}
它没有得到任何结果,而是最终陷入了无限循环。
答案 0 :(得分:0)
好吧,如果您的函数返回一个int,则您并没有真正解决问题,我想这应该可以解决
unsigned long long collatz(unsigned long long n)