【问题标题】:Prime Generator Overflow? C++Prime 发电机溢出? C++
【发布时间】: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


【解决方案1】:

假设您在 Windows 上,您的堆栈太小(默认为 1MB),无法在堆栈帧中容纳以下变量:

int Num_Array [MAX_NUM_ARRAY];

你应该在堆中分配它:

int *Num_Array = new int[MAX_NUM_ARRAY];
...
delete[] Num_Array;

【讨论】:

  • "你应该在堆中分配它。" - 为什么? (未)初始化内存(DATA 或 BSS)还不够好吗?
  • @H2CO3 如果我错了,请纠正我,但我认为这只会不必要地增加可执行文件的大小?
  • 如果您对过早的优化战争有兴趣:为什么不呢?好吧,它可能会增加可执行文件的大小,但也会更快,因为它有一个常量地址。
  • @H2CO3 哦,那我想我们都可以同意我们可以在初始化期间在堆中分配它。
  • @JoesphH 澄清一下:不鼓励在程序的整个生命周期内对静态数据进行堆分配。
【解决方案2】:

也许是因为你正在破坏堆栈。将数组移出main() 函数怎么样?

#define MAX_NUM = 1000000;
#define MAX_NUM_ARRAY (MAX_NUM + 1)
int Num_Array[MAX_NUM_ARRAY];

int main()
{
    // etc.
    return 0;
}

【讨论】:

    【解决方案3】:

    您使用 std::fill_n 的事实表明您实际上是在编写 C++,而不是 C。

    您可以通过使用真正的 bool 数组而不是 int 数组来大大减少程序的内存消耗。由于您使用的是 C++,因此您可以使用 std::vector&lt;bool&gt; 获取布尔数组。与bool[n] 不同,std::vector&lt;bool&gt;(n) 只占用 n 位(bool[n] 可能占用 8n 位,或者您的机器/编译器上的最小对齐方式,而您的 Num_Array[n] 实际上占用 32n 位,因为您正在使用用于存储布尔值的 32 位整数)。

    其他 cmets 建议您将此值存储在堆上而不是堆栈上。 std::vector&lt;bool&gt; 会自动为您完成。

    【讨论】:

    • 我的程序的编写方式使用数组中的三个变量。一个是任意的,所以我可以看到布尔数组背后的逻辑。但是我将如何实现这一点,以便仍然可以包含其他任意变量? - 谢谢
    • 查看您的代码,您检查或设置的唯一值似乎是 0 或 1。因为在检查 1 之后,您的代码仍然将其设置为 0(不检查 3),我认为如果将整个数组初始化为 0 而不是 3 会产生相同的效果。然后您可以将所有内容存储为一个位。
    猜你喜欢
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2019-04-08
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-01-24
    相关资源
    最近更新 更多