由于某种原因,这总是返回值1.这一点是找到循环次数最多的起始编号(1-1,000,000)(直到j = 1)。 j最终总是最终为1(collatz理论),如果是偶数,则将j除以2,或者将3除以3,如果奇数则加1。
#include <iostream>
using namespace std;
int collatz() {
int counter = 0;
int holder = 0;
for (int i = 999999; i > 1; i--){ // loops 999,999 times
for (int j = i; j != 1; counter++) { // loops until j = 1, records amount of loops
if (j % 2 == 0) { // if j is even, divide by 2, +1 to counter
j = j / 2;
} else {
j = (j*3) + 1; // if j is odd, multiply by 3 and add 1, +1 to counter
}
}
if (holder < counter){ // records highest number of loops
holder = counter;
counter = 0;
} else {
counter = 0;
}
}
return holder;
}
int main()
{
cout << collatz << endl;
return 0;
}
答案 0 :(得分:3)
您不是调用您的函数,而是打印出函数指针(转换为bool
值true
(即1
))。
答案 1 :(得分:1)
首先,使用unsigned int
或unsigned long long
作为j
的变量类型来增加算术范围。
然后,在循环中,检查溢出。
while (j!=1) {
counter++;
if (j % 2 == 0) {
j >>= 1;
} else {
unsigned int j2 = j;
j = (j*3) + 1;
if (j2 > j) {
return -1; // or surround this with try/catch/throw exception
}
}
}
使用int i;
,计数器将在i == 113383处溢出;
并且unsigned int i;
位于159487.如果未选中这些,则可能出现无限循环。