【问题标题】:How many primes in between a given range? C++ [duplicate]给定范围之间有多少个素数? C++ [重复]
【发布时间】:2014-01-18 00:21:43
【问题描述】:

所以,我制作了这个小程序。它给出了所有正确的输出,但是当它上传到在线评委时,它让我丢了一个Time Limited Exceeded。关于如何提高效率的任何想法?

这是我的代码。

int const MAX = 1000001;  
#include<iostream> 
#include<string>
#include<cmath>

using namespace std;

int main()
{
    int count = 0, array[MAX], a, b, pi = 0;  
    bool end = false;

for(int i = 1; i <= MAX; i++)
{
    count = 0;
    for(int j = 2; j <= sqrt(i); j++)
    {
        if(i % j == 0)
        {
            array[i]=0;
            count++;
            break;
        }
    }
    if(count == 0 && i != 1){
        array[i]=1;
    }
}

do {
    cin >> a >> b;
    pi = 0;
    if ((a == 0) && (b == 0)) {
        end = true;
        break;
    }
    else {
        for (int i = a; i <= b; i++) {
            if (array[i] == 1) {
                pi ++;
            }
        }
        cout << pi << endl;
    }
} while (end == false);
cout << endl;

return 0;
}

【问题讨论】:

  • 试着想象在每个循环步骤中调用sqrt() 的效率有多高。或者假设编译器有大脑,为什么你使用int 来获取可以保存在bool 中的信息。最后,我没有看到逐步乘法器的代码。你熟悉Sieve of Eratosthenes吗?
  • 这个程序不接受输入吗?为什么不从网上打印一份固定的素数列表?
  • @phs 我不是要打印素数列表,而是确定它们中有多少在给定范围内。
  • @WhozCraig 不,我不熟悉埃拉托色尼筛,但我会寻找它。谢谢!
  • @WhozCraig 肯定他需要某种初筛。但他可能更喜欢Sieve of Atkin,这应该是Sieve of Eratosthenes 的优化版本(参见Sieve of Atkin

标签: c++ algorithm primes


【解决方案1】:

您可以考虑使用Sieve of Eratosthenes。这是一种高效的素数生成算法。

【讨论】:

  • 我在上面。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多