【发布时间】:2013-02-10 17:38:26
【问题描述】:
我正在编写一个使用eratosthenes 筛子生成素数的生成器。我已经让它生成低于 521102 的素数,但任何更高的数字都会导致程序崩溃。这是我的代码。
#include <iostream>
using namespace std;
int main ()
{
int long MAX_NUM = 1000000;
int long MAX_NUM_ARRAY = MAX_NUM+1;
int Num_Array [MAX_NUM_ARRAY];
std::fill_n(Num_Array, MAX_NUM_ARRAY, 3);
int long sieve_prime = 2;
int long sieve_prime_constant = 0;
Num_Array [0] = 1;
Num_Array [1] = 1;
while (sieve_prime_constant <= MAX_NUM_ARRAY)
{
if (Num_Array [sieve_prime_constant] == 1)
{
sieve_prime_constant++;
}
else
{
Num_Array [sieve_prime_constant] = 0;
sieve_prime=sieve_prime_constant;
while (sieve_prime<=MAX_NUM_ARRAY - sieve_prime_constant)
{
sieve_prime = sieve_prime + sieve_prime_constant;
Num_Array [sieve_prime] = 1;
}
if (sieve_prime_constant <= MAX_NUM_ARRAY)
{
sieve_prime_constant++;
sieve_prime = sieve_prime_constant;
}
}
}
return 0;
}
我将 MAX_NUM 设置为 1000000,但它不起作用。但正如我之前所说,低于 521102 的数字确实有效。我需要能够测试更高的数字。我的问题是什么,我该如何解决?
非常感谢!
感谢您的回复。我尝试了动态分配数组的解决方案。在某种程度上,它运作良好。将 MAX_NUM 设置为 5 亿左右后,我在运行程序时收到此错误...
在抛出 'std::bad_alloc' 的实例后调用终止 什么():std::bad_alloc
此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。
拥有 5 亿的屋顶已接近可接受,但更高还是更好? 还有其他想法吗?
【问题讨论】:
-
哪一行导致崩溃?
-
您可能在 Windows 上运行,并且可能超出了堆栈的最大限制。要么动态分配数组,要么静态分配(可能在函数外),或者找到增加堆栈大小的方法。
-
这不是问题,但是使用长整数的习惯用法是将它们简单地声明为
long。
标签: c++ arrays overloading generator