所以我需要有关我的代码的帮助。由于某种原因,当我输入超过 500,000 的数字时,它不断崩溃。这是确切的分配。
实现埃拉托色尼筛法并用它来查找所有素数
数量小于或等于一百万。使用结果
证明哥德巴赫猜想对于 4 到 4 之间的所有偶数
100万,含在内。
使用以下声明实现一个函数:
void sieve(int array[], int num);
该函数采用整数数组作为其参数。数组
应初始化为值 1 到 1000000。
函数修改数组,以便仅保留素数;
所有其他值均归零。
必须编写此函数以接受任意整数数组
尺寸。您必须输出 1 到 1 之间的所有素数
1000000,但是当我测试你的函数时,它可能位于 a 的数组上
不同的尺寸。
使用以下声明实现一个函数:
void goldbach(int array[], int num);
该函数采用与前一个函数相同的参数
并用两个显示 4 到 1000000 之间的每个偶数
添加到它的质数。
这里的目标是提供有效的实施。这
表示在确定是否时不进行乘法、除法或模运算
一个数是素数。这也意味着第二个函数必须找到
有效地得到两个素数。
程序的输出:
1 到 1000000 之间的所有素数
4 到 1000000 之间的所有偶数以及两个素数
总和为它的数字。
不要提供该项目的输出或会话记录!
这是我到目前为止所拥有的。如果有人能帮助我那就太好了。
#include <iostream>
using namespace std;
void sieve (int array[], int num);
int main()
{
int num;
cout << "Enter a number to calculate up to." << endl;
cin>> num;
if ( num < 2 )
return 0;
int array[num];
array[0]= array[1]= 0;
for ( int i= 2; i < num; ++i )
array[i]= i;
sieve(array,num);
for (int i=0; i<num; i++)
if (array[i] > 0)
cout << array[i] <<" "<<endl;
cout<<endl;
return 0;
}
void sieve( int array[], int num )
{
for ( int i= 0; i < num; ++i )
{
if ( array[i] != 0 )
{
for ( int j= i+i; j < num; j += i )
{
array[j]= 0;
}
}
}
}
您的代码崩溃的原因是您在此处对数组使用 VLA 分配
int array[num];
它是用来分配的num
堆栈的 int 元素,它很可能太小而无法容纳一百万个int
values.
您应该注意,它不是标准的 C++ 功能,而是许多编译器实现提供的扩展。
为了解决这个问题,有三种选择:
- 您将程序使用的堆栈大小配置得足够大以容纳
int
元素(这取决于操作系统)
- 你用一个
std::vector<int> array(num);
相反,它在堆内存上分配这些元素
- 您自己使用在堆上分配必要的内存
int* array = new int[num];
and delete [] array;
在程序结束时(我不推荐这个解决方案,因为它很容易在正确的内存管理方面犯愚蠢的错误)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)