我编写了一个解决3n + 1问题的代码 但当我运行它并输入(1 200000)我得到 访问冲突读取位置0x50F9BF08
我不知道这个例外是什么,如果有人帮忙,我会非常感激 这是我的代码:
#include "iostream"
#include "conio.h"
using namespace std;
#define MAX 1000000
long int cycleLengthResult[MAX] = { 0 };
long int cycleLength(long int num)
{
if (num > MAX)
{
if (num % 2 == 0)
return 1 + cycleLength(num / 2);
else
return 1 + cycleLength(3 * num + 1);
}
else if (cycleLengthResult[num] == 0)
{
int count = 0;
if (num == 1)
count = 1;
else if (num % 2 == 0)
count = 1 + cycleLength(num / 2);
else
count = 1 + cycleLength(3 * num + 1);
cycleLengthResult[num] = count;
}
return cycleLengthResult[num];
}
int main()
{
int i, j;
long int max;
while (cin >> i >> j)
{
max = 0;
cout << i << " " << j << " ";
if (i > j)
{
int temp;
temp = j;
j = i;
i = temp;
}
for (int k = i; k <= j; k++)
{
cycleLength(k);
if (cycleLengthResult[k] > max)
max = cycleLengthResult[k];
}
cout << max << endl;
}
_getch();
return 0;
}
答案 0 :(得分:0)
你很有可能超越了cycleLengthResult数组。当然if (num > MAX)
子句中的表达式是可疑的 - 如果num是奇数,它肯定会超出数组边界。
轻松解决这个问题的一种方法是不使用原始数组,而是使用std::array
,并使用operator[]
访问它,但使用成员函数at()
。 at()
还有为你做边界检查的额外好处,所以你可以看到你的功能失败的地方。
答案 1 :(得分:0)
你超出了long int
的限制。如果您已经调试了代码,那么当您以return 1 + cycleLength(3 * num + 1);
为827370449递归调用num
时,您会看到问题发生,因此3 * num + 1
为2482111348(大于LONG_MAX或2147483647)随后调用cycleLength
num
为-1812855948。您可以使用无符号值long int cycleLength(unsigned long int num)
来解决此问题。我没有花时间去研究实际的算法,但如果值增长很大,你可能会更好地使用num
的64位值。