SPOJ上的Prime Generator PRIME1

时间:2018-08-29 08:31:50

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

Peter想为其密码系统生成一些质数。救救他!您的任务是生成两个给定数字之间的所有素数! 输入

输入以一行中的测试用例数t(t <= 10)开始。在接下来的每条t行中,有两个数字m和n(1 <= m <= n <= 1000000000,n-m <= 100000)用空格隔开。 输出

对于每个测试用例,请打印所有素数p,以使m <= p <= n,每行一个数字,测试用例用空行分隔。

任何人都可以帮助我优化我的代码,因为即使我正在使用筛子,它也显示超过了时间限制。这是问题的链接  https://www.spoj.com/problems/PRIME1/ 这是我的代码:

#include <iostream>
#include <math.h>
using namespace std;

int is_prime(int m)
{
    int i,c=0;
    for(i=2;i<=sqrt(m);i++)
    {
        if(m%i==0)
        c++;
    }

    if(c==0)
    return 1;
    else
    return 0;
}
int main()
{
    int n,m,i,j,k,num;
    cin>>num;
    for(i=1;i<=num;i++)
    {
      cin>>m>>n;


      int a[n];
      for(j=0;j<=n;j++)
      a[j]=1;
      for(j=m;j<sqrt(n);j++)
      {
         if(is_prime(j)==1)
         {

            for(k=j*j;k<=n;k=k+j)
            {
                a[k]=0;
            }
         }
      }
      for(j=m;j<=n;j++)
      {
            if(a[j]==1)
            cout<<j<<endl;


      }
    cout<<endl;


   }

    enter code here
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您的代码有几个问题:

  • 在给定的时间限制下,您无法创建10 ^ 9(int a[n])数组!

  • 嵌套的 for 循环花费的时间几乎O(sqrt(n-m)^2)

要进行优化,请使用https://en.wikipedia.org/wiki/Sieve_of_Eratostheneshttps://www.geeksforgeeks.org/segmented-sieve/