1. 程式人生 > >篩選法<求素數表>

篩選法<求素數表>

spa 素數 表示 fine define pri bsp 遍歷 數組

如果題目的數據規模較大,常規地逐個判斷素數的方法行不通,可以使用篩選法進行預處理,將所有素數一次性求出並存入數組中。

篩選法求素數的主要思想如下:

(1)將1~N的所有數都標記為素數,0表示素數,1表示非素數。

(2)1不是素數,也不是合數,標記為1。

(3)2是素數,保留。但比2大的所有2的倍數都標記為1,直到大於N為止。

(4)繼續尋找素數標記,找到3,將其保留,但比3大的所有3的倍數都標記為,直到大於N為止。

……

tip:如果數組聲明為全局變量,那麽數組會初始化為全0,所以我沒有定義int a[N]={0};

#include "stdio.h"    
#define N 1000001    
int
a[N]; //將1~N中的所有數都先標記為0,初始時均標記為素數,0是素數,1是非素數 void list() { int t,i; a[0]=a[1]=1; //素數從2開始算,非素數標記為1 for(i=2;i<N/2;i++) //最多只要遍歷到N/2即可,N/2一定非素數 { if(a[i]==0) //如果找到一個素數 { t=2*i; //
先從i的2倍開始標記 while(t<=N) { a[t]=1; //標記為非素數 t+=i; //i的3倍、4倍、5倍......(≤N)都標記為1(非素數) } } } } int main() { list(); //生成素數表 int i; for
(i=1;i<=N;i++) { if(a[i]==0) printf("%d\n",i); } return 0; }

篩選法<求素數表>