c++ - 段错误 C++(数组太大?)

标签 c++ arrays segmentation-fault

我正在研究 Euler 项目 Problem 14 ,我需要找到 1,000,000 以内的最长 collat​​z 序列。我提出了一种适用于较小数字(例如 100)的算法,该算法将 1 - 100 之间的每个 collat​​z 数字存储到一个数组中,并使用该数组作为引用来加快计算更高数字的速度。 我的代码如下:

#include <iostream>
using namespace std;

long even(long n){ //the even-collatz function
    n=n/2;
    return n;
}

long odd(long n){ //the odd collatz function
    n=3*n+1;
    return n;
}

int main(){
    long  x, c=0, y[1000000]; // x= the number we are finding the collatz number of, c a counter that keeps track of how many steps we've taken in the sequence, y is an array to store the collatz numbers.

    for (x=1; x<1000000; x++){ //iterates from x=1 to 1 million
            long a = x;     //sets a number a equal to the number we are currently trying to find the collatz number of
            long b = a;     
            c=0;                    //intializes counter at 0 
            while (a!=0){           //loops infinitely; the only way to exit is through a break.
                    if (a%2==0){    // detects if the number is even
                            a=even(a);      //applies the even-collatz function if so; sets x=x/2
                            c=c+1;
                            if (y[a]!=0){   // checks if the collatz number of x is already discovered
                                    y[b]=c+y[a]; //adds the current number of steps to the collatz number of x and 
                                    break;  //exits the while loop
                            }

                    }
                    else if (a==1){         //checks if the new x is equal to one and
                            y[b]=c;         //if it is, it writes the current value of c to y[b] and
                            break;          // exits the loop
                    }
                    else if (a%2==1){       //same as the "even" block, except for odd numbers 

                            a=odd(a);
                            c=c+1;
                            if( y[a]!=0){
                                    y[b]=c+y[a];
                                    break;
                            }

                    }
            //this is the end of the while loop; we've applied the collatz function as many times as we've needed to to x, and incremented the counter each time
            }
  }

    long z;
    for (int n=0;n!=100;n++){
            if (y[n+1]>y[n]){
                    z=y[n+1];
            }
    }
    cout << z << "\n";


}

我遇到的问题是我在 for 循环中的 x=1818 之后遇到段错误。通过调试,我发现段错误发生的速度取决于数组 y 的大小,所以我假设数组太大了。根据我对段错误的(基本)理解,我认为我只是在访问“不允许”的内存。我有什么办法可以规避这个问题,还是我应该开始着手解决这个问题的另一种方法?我正在 Ubuntu studio 上使用 g++ 进行编译。

最佳答案

这个数组对于您系统的默认堆栈大小来说可能太大了;最简单的修复方法是将其定义更改为:

std::vector<long> y(1000000);

其他一切都可以保持不变。您可以稍后在循环中使用 y.size() 而不是魔数(Magic Number) 1000000

关于c++ - 段错误 C++(数组太大?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26080404/

相关文章:

c - 在 ubuntu 中执行程序时出现 C 段错误

c++ - 有什么方法可以同时运行 2 个循环?

c - 我有一个c练习

c - 将指向 char 数组的指针传递给函数时发生段错误

javascript - 在html中显示来自javascript数组的图像

arrays - R 中维度名称上的数组并集

c - 声明为 "inline"的函数递归是否合法?

c++ - 将鼠标位置转换为方向和后退

c++ - 提升用户输入功能的测试用例

c++ - 返回对临时对象的引用