1. 程式人生 > 其它 >nyoj---快速查詢素數

nyoj---快速查詢素數

快速查詢素數

時間限制:1000 ms  |  記憶體限制:65535 KB

難度:3

描述現在給你一個正整數N,要你快速的找出在2.....N這些數裡面所有的素數。

輸入給出一個正整數數N(N<=2000000)

但N為0時結束程式。

測試資料不超過100組輸出將2~N範圍內所有的素數輸出。兩個數之間用空格隔開樣例輸入

5
10
11
0

樣例輸出

2 3 5
2 3 5 7
2 3 5 7 11

來源經典題上傳者路過這

同一道題,雖然用同一種方法,但是,效率還是有差別的....

試除法。。。(1)

也是我們最常用的。。。來打表(素數表)

程式碼:

#include<stdio.h>
#define maxn 150000
int arr[maxn]={2,3,5,7,11};
int main()
{
    int n,i,j,k=5;
    for(i=13;i<=1999993;i++)
      {
          for(j=2;j*j<=i;j++)
          {
              if(i%j==0)  break;
          }
          if(j*j>i) arr[k++]=i;
      }
    
    while(scanf("%d",&n),n)
    {
      for(i=0;arr[i]<=n&&arr[i]!=0;i++)
      {
          if(i==0)
        printf("%d",arr[i]);
          else
        printf(" %d",arr[i]);
      }
      printf("n");
    }
    return 0;
}      

效率不是非常的高.....

有一種比較快的方法,打表。

模板為:

int prime[200000];
bool bo[10000001];

int  prime_table()
{
int i,j,flag=0;
memset(bo,0,sizeof bo);
bo[0]=bo[1]=1;
for(i=2;i<=1000;i++)
{
if(!bo[i])
{
for(j=i*i;j<=len;j+=i)
bo[j]=1;
}
}
for(i=0;i<=len;i++)
if(!bo[i])
prime[flag++]=i;
return flag //在該範圍內的個數....
}

程式碼:

#include<stdio.h>
#define maxn 150000
#define len 1999993
int prime[maxn];              //儲存素數
bool isprime[len+1]={1,1};   //用來判斷是否為素數,1代表不是,0代表是
void prime_table()
{
    int i,j,flag=0;
  for(i=2;i*i<=len;i++)        //對於在給定的範圍內,就是打表的範圍內
  {
      if(!isprime[i])         
      {
          for(j=i*i;j<=len;j+=i)
              isprime[j]=1;
      }
  }
  for(i=0;i<=len;i++)
     if(!isprime[i])
        prime[flag++]=i;
  
}
int main()
{
    int n,i;
    prime_table();
    while(scanf("%d",&n),n)
    {
          printf("%d",prime[0]);      
      for(i=1;prime[i]<=n&&prime[i]!=0;i++)
            printf(" %d",prime[i]);
      
      printf("n");
    }
    return 0;
}