Collat​​z序列算法无法正常工作

时间:2013-03-21 10:20:45

标签: c++ algorithm

由于某种原因,这总是返回值1.这一点是找到循环次数最多的起始编号(1-1,000,000)(直到j = 1)。 j最终总是最终为1(collat​​z理论),如果是偶数,则将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;
}

2 个答案:

答案 0 :(得分:3)

您不是调用您的函数,而是打印出函数指针(转换为booltrue(即1 ))。

答案 1 :(得分:1)

首先,使用unsigned intunsigned 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.如果未选中这些,则可能出现无限循环。