访问冲突读取位置0x50F9BF08

时间:2016-03-10 17:42:12

标签: c++

我编写了一个解决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;
}

2 个答案:

答案 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位值。