求有限區間內素數個數
阿新 • • 發佈:2019-04-28
pan ans bsp 區間 class num 每一個 但我 一個數
求[l, r]這段區間中有多少素數
1 ≤ l ≤ r ≤ 10
一個顯然的想法是利用for循環枚舉[l, r]中的每一個數。然後利用樸素算法O(√X)進行判斷。
整體復雜度O(N√N),不符合要求
#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...為合數。我們“篩”掉這些必然為合數的數。那麽當我們枚舉到i,i還沒有被篩掉,那麽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; }
求有限區間內素數個數