素數打表的四種方法

2021-08-26 15:03:52 字數 1913 閱讀 2332

題目:給出乙個正整數n,列印出所有從1~n的素數(即質數);

1.傻瓜解法

複製**

int i,n;

while(scanf("%d",&n)!=eof)

複製**

這是理所當然的想法,按照素數的定義,除了1和它本身沒有其他的因數,就是素數。

這種解法的缺點就是紅色標註那裡,這種迴圈規模n稍微大點,執行時間就會特別特別長。

2.普通解法--sqrt(n)

int i,n,x;

while(scanf("%d",&n)!=eof)

複製**

這裡迴圈取到sqrt(n),效率改進不少了,但顯然還是不夠理想。

3.普通篩選法--埃拉託斯特尼篩法

關於埃拉託斯特尼篩法,維基百科上的gif講解和偽**都特別清楚。

所用的原理大概是所使用的原理是從2開始,將每個素數的各個倍數,標記成合數。乙個素數的各個倍數,是乙個差為此素數本身的等差數列。此為這個篩法和試除法不同的關鍵之處,後者是以素數來測試每個待測數能否被整除。

實現方法:建立乙個bool型別的陣列check,乙個int型別的陣列prime儲存素數,先假設所有的數都是素數(初始化為0),從第乙個素數2開始,把2的倍數都標記為非素數(check置為1),一直到大於n;然後進行下一趟,找到2後面的下乙個素數3,進行同樣的處理,直到最後,陣列中依然為0的數即為素數。

**如下:

#include

#include

#define maxn 100000

#define maxl 1000000

_bool check[maxn];

int prime[maxl];

int main(void)

for (int i = 0; i < count; i++)

printf("%d\n", prime[i]);

}

return 0;

}

埃拉託斯特尼篩法雖然已經將時間複雜度降低到o(nloglogn),但是還是有不足之處。

因為6在i==2時就被標記了,而在i==3的時候又被標記了一次,所以還是有改進的空間。

4.線性篩選法——尤拉篩法

尤拉篩法通過紅色標記部分保證每個合數只會被它的最小質因數篩去,時間複雜度降低到o(n)。

#include

#include

#define maxn 100000

#define maxl 1000000

int prime[maxn];

_bool check[maxl];

int main(void)

}

for (int i = 0; i < count; i++)

printf("%d\n", prime[i]);

}

return 0;

}

素數打表法(四種方法)

1.手動打表 當需要的資料範圍較小時,比如下面的40個 int prime 40 素數打表,因為n最大是20,所以只要打到402.按定義 耗時長 最基本的方法是通過素數的定義直接判斷,只能被1和它本身整除的數就是素數了。這種方法適合判斷單個數是否為素數,當要求乙個範圍內素數而這個範圍又比較大時,這種...

oracle增加表空間的四種方法

1.檢視所有表空間大小 select tablespace name,sum bytes 1024 1024 from dba data files group by tablespace name 2.未使用的表空間大小 select tablespace name,sum bytes 1024 ...

PHP遞迴四種方法

data json data str replace data arr json decode data true print r arr dir foreach arr as k v header content type text html charset utf 8 print r arr p...