要枚舉n以內的素數,可以用埃氏篩法。這是一個與輾轉相除法一樣古老的算法。
首先,將2到n范圍內的所有整數寫下來。其中最小的數字2是素數。將表中所有2的倍數都划去。表中剩余的最小數字是3,它不能被更小的數整除,所以是素數。再將表中所有3的倍數全都划去。依次類推,如果表中剩余的最小數字是m時,m就是素數。然后將表中所有m的倍數全部划去。像這樣反復操作,就能依次枚舉n以內的素數。
int prime[maxn];//第i個素數 bool is_prime[maxn];//is_prime[i]為true表示i是素數 int sieve(int n)//返回n以內的素數 { int cnt=0; for(int i=0;i<=n;i++) is_prime[i]=true; is_prime[0]=is_prime[1]=false; for(int i=2;i<=n;i++) if(is_prime[i]) { prime[cnt++]=i; for(int j=2*i;j<=n;j+=i) is_prime[j]=false; } return cnt; }
埃氏篩的復雜度僅有O(nloglogn),算是比較快的了。當數據量不是太大的時候,可以把它的復雜度看作是線性的。
最近在學Python,附上Python 3.6的代碼:
def eratosthenes(n): P = [i for i in range(2, n+1)] p = 0 while True: for i in P[p + 1:]: if i % P[p] == 0: P.remove(i) if P[p]**2 >= P[-1]: break p += 1 return P if __name__ == "__main__": print (eratosthenes(120))