【问题标题】:value requires 1000000000 bytes, which is more than max-value-sizevalue 需要 1000000000 字节,大于 max-value-size
【发布时间】:2016-06-14 12:53:40
【问题描述】:

我在 spoj.com 上遇到了这个问题

http://www.spoj.com/problems/PRIME1/

在阅读了一些关于素数生成算法的文章后,我发现“阿特金斯筛”是最快的素数生成算法。在本教程http://www.geeksforgeeks.org/sieve-of-atkin/

的帮助下,我已经部分实现了算法

当我运行代码时,它给了我分段错误。调试后我才知道这段代码不是最优的,它使用了更多的内存和存储空间。有人可以告诉我如何优化程序。这是我的代码 sn-p。是的,它不完整。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int sieveOfAtkin(long int limit)
{
    // if limit is either 2 or 3, print them
    if (limit >= 2)
    {
        cout << 2 << endl;
    }

    if (limit >= 3)
    {
        cout << 3 << endl;
    }


    bool sieve[limit];
    for (long int i=0; i<=limit; i++)
        sieve[i] = false;

    for (long int x=1; x<limit; x++)
    {
        for (long int y=1; y<limit; y++)
        {

            long int n = (4*x*x) + (y*y);
            if (n<=limit && (n%12==1 || n%12==5))
                sieve[n] ^= true;

            n = (3*x*x) + (y*y);
            if (n<=limit && (n%12==7))
                sieve[n] ^= true;

            n = (3*x*x) - (y*y);
            if (x>y && n<=limit && (n%12==11))
                sieve[n] ^= true;
        }
    }

    for (long int r=5; r*r<limit; r++)
    {
        if(sieve[r])
        {
            for(long int i=r*r; i<limit; i+=r*r)
                sieve[r] = false;
        }
    }

    for (long int i=5; i<limit; i++)
        if(sieve[i])
            cout << i << endl; 

    return 0;
}

int main(void)
{
    long int x;
    cin >> x;
    sieveOfAtkin(x);
    return 0;
}

【问题讨论】:

  • 对于初学者来说,std:vector&lt;bool&gt; 更节省内存。我差点忘了-this.
  • @LogicStuff 是的..会读到它
  • 如果你被要求找到 999,999,990 到 1,000,000,000 之间的质数,那么找到所有小于一亿的质数可能会被认为是浪费时间。
  • @rici 是的,目前正在对上限和下限进行更改

标签: c++ algorithm primes sieve sieve-of-atkin


【解决方案1】:

首先,阿特金筛比埃拉托色尼筛更快是一个互联网神话。 Atkin 筛在某些限制下更快,但 Eratosthenes 筛通常更快,并且是实际使用它来研究素数的数学家选择的筛。

其次,当筛子太大而无法放入内存时,您可以分段筛子。详情请见this answer

【讨论】:

  • 成功了。我计算了高达 32000 的素数,因为 ~31622 是我需要的最大数的平方根。即 10 亿
  • 谢谢!虽然我的解决方案不是那么理想,但它确实有效:)
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多