1. 程式人生 > >求有限區間內素數個數

求有限區間內素數個數

pan ans bsp 區間 class num 每一個 但我 一個數

[l, r]這段區間中有多少素數

1 l r 10

一個顯然的想法是利用for循環枚舉[l, r]中的每一個數。然後利用樸素算法O(X)進行判斷。

整體復雜度O(NN),不符合要求

#include<iostream>
using namespace std;

int r,l;
int ans;

int main(){

    cin>>r>>l;
    for( int i=r ; i<=l ; ++i ){
        if( n%i!=0
){ ans++; } } cout<<ans; return 0; }

仍然考慮枚舉判斷每個數是否是素數,但我們這次從2開始判斷。

考慮對於任意一個數x,不論x是否為素數,都x*2,x*3,x*4...為合數。我們“篩”掉這些必然為合數的數。那麽當我們枚舉到ii還沒有被篩掉,那麽i必然為素數。

時間復雜度O(NlogN)

#include<iostream>
using namespace std;

int r,l;
int prime[1e6],c; bool num[1e6]; int ans; int main(){ cin>>r>>l; for( int i=2 ; i<=l ; ++i ){ if( !num[i] ) prime[++c]=i; if( i>=r && i<=l && !num[i] ) ans++; for( int j=1 ; i*prime[j]<=n && j<=c ; ++j ){ num[ i
*prime[j] ] = 1; if( i%prime[j]==0 ) break; } } cout<<ans;   return 0; }



求有限區間內素數個數