簡體   English   中英

SPOJ上的Prime Generator PRIME1

[英]Prime Generator PRIME1 on SPOJ

彼得想為其密碼系統生成一些質數。 救救他! 您的任務是生成兩個給定數字之間的所有素數! 輸入項

輸入以一行中的測試用例數t開始(t <= 10)。 在接下來的每條t行中,有兩個數字m和n(1 <= m <= n <= 1000000000,nm <= 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;
}

您的代碼有幾個問題:

  • 在給定的時間限制下,您無法創建10 ^ 9( int a[n] )數組!

  • 嵌套的for循環花費的時間幾乎為O(sqrt(nm)^2)

要進行優化,請使用https://en.wikipedia.org/wiki/Sieve_of_Eratostheneshttps://www.geeksforgeeks.org/segmented-sieve/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM