如何修复超过 1 分钟规则的 Collatz 序列代码?
How to fix my Collatz sequence code that exceeds the 1-minute rule?
总结
大家好。我正在尝试解决一个与 Collatz 猜想相关的相对简单的问题。
首先问题如下:
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)
总结
大家好。我正在尝试解决一个与 Collatz 猜想相关的相对简单的问题。
首先问题如下:
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)