gpt4 book ai didi

c++ - 在 C++ 中初始化数组时出现 Seg 错误(欧拉项目编号 3)

转载 作者:行者123 更新时间:2023-11-30 17:46:03 25 4
gpt4 key购买 nike

所以我正在尝试编写一个程序来解决最大素因数的欧拉项目问题,虽然我知道代码在结构上是正确的(只要它返回较小数字的正确答案,包括他们给出的示例 13195 ),当我输入我们要解决的数字时,我一直收到段错误,即600851475143。代码如下:

#include <stdio.h>
#include <math.h>

main(){
int number,a,b,c,i,j,n,gpf;
printf("Input number to analyze: ");
scanf("%d",&number);
a = number/2;
printf("%d\n",a);
int* primesieve = new int[a+1]; /*IMPORTANT LINE*/
for (i=0;i<a+1;i++){
primesieve[i] = 1;
}
for (j=2;j<=a;j++){
if (primesieve[j] == 1){
for (c=2;j*c<=a;c++){
primesieve[j*c] = 0;
}
}
}
for (n=2;n<=a;n++){
b = number/n;
printf("%d\n",b);
if (number % n == 0){
if (primesieve[b] == 1){
gpf = b;
n = a+1;
}
}
}
delete[] primesieve;
printf("The greatest prime factor of %d is %d.\n",number,gpf);
}

问题来自素数筛数组的初始化,因为我省略了该行之后的所有行,但仍然遇到了问题。我最初使用以下代码声明该数组,该代码返回低至 1000 万的值的段错误。

int primesieve[a+1];

我在此站点上搜索了一个解决方案,该解决方案对动态数组分配进行了更改,但这虽然解决了 1000 万的问题,但显然并没有解决明显更大的值。我注意到其他解决方案提到了一些关于使用 malloc() 或在 main() 之外静态声明数组的内容,但坦率地说,我不理解这些,因为我的入门编程类(class)几乎没有提到 malloc() 并且我认为导致声明的代码需要包含在 main() 中的数组的数量。 (供引用: Segmentation Fault While Creating Large Arrays in CSeg Fault when initializing array 。)我确信这是一个相当简单的问题,但我是一个相对较新的程序员,因此对分配内存的理解很差,所以任何建议、解决方案或解释我发现的其他解决方案将不胜感激。

最佳答案

您的体验与编译器的物理限制和精度有关。第一次尝试,在栈上分配数组

int primesieve[a+1];

很快就失败了,因为在大多数系统上,与堆相比,堆栈的大小相当有限。

在堆上分配

int* primesieve = new int[a+1]; 

给你更多的空间,但你仍然有可寻址内存的限制。现在,600851475143 是一个相当大的数字,即使将其除以 2。假设 int 的大小是 4 个字节,您可能会想,是否真的可以寻址那么多内存。使用 32 位,您可以寻址 2^32 = 4294967296 字节。

关于c++ - 在 C++ 中初始化数组时出现 Seg 错误(欧拉项目编号 3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com