素數篩選法

2021-08-21 23:44:28 字數 1138 閱讀 7402

素數篩選法差不多是打標,用前面確定的質數篩選掉後面的合數,然後遍歷下來所有的合數都被篩選掉了,剩下的都是素數。

int vis[maxn] = ;

for(int i = 2; i <= n; i++)

for(int j = i*2; j <= n; j+=i)

vis[j] = 1;

這是沒有優化的素數篩選法,也已經很快了,時間複雜度是n log n。

m = sqrt(n+0.5)

在m~n之間的數,只要在前m個數中沒有質因子,那麼這個數肯定就是質數:乙個數a只要有因子,那麼2~sqrt(a)之間一定有因子,那麼也就是說m~n之間的數只要有因子,那麼在2~m之間一定存在它的因子

優化後的素數篩選法:

int m = sqrt(n+0.5);  ///素數篩選法的優化,在後sqrt(n)的數中,遍歷的前sqrt(n)中沒有這個數的(質)因子,那麼這個數就是乙個質數

memset(vis, 0, sizeof(vis));

for(int i = 2; i <= m; i++)

if(!vis[i]) ///素數篩選法的優化,不是=質數就不用更新後面的數了,因為前面的質數已經將它的這些倍數更新了

for(int j = i*i; j <= n; j += i) ///i*i也是乙個優化,i * x中x < i的數已經被更新過了

vis[j] = 1;

用素數篩選法做的一道題目,大概題意就是:求x ~ n之間沒有平方因子的數的個數

思路:用素數篩選法求出2~sqrt(n+0.5)中的素數,然後類似於篩選法,用2~sqrt(n+0.5)中的素數篩選掉x~n之間含有素數的平方的數就ok了

#include#include#include#includeusing namespace std;

int vis[10000000];

int ans[10000005];

int main()}}

for(int i = 0; i <= n-x; i++)

if(!ans[i])

sum++;

printf("%d", sum);

return 0;

}

素數篩選法

篩選素數法 搞acm的都知道,素數是數論中必不可少的知識,也是必須要掌握的,關於素數的篩選有好幾種方法,下面一一道來,寫的不好還請提出。第一種是最常規的做法 int main if j sqrt i cout 這種方法肯定是比第一種快的,至於快多少大家可以比較一下,注意到裡面的for迴圈是到sqrt...

素數篩選法

素數,是指因子只包含1和其本身的數,那麼,我們怎麼判斷素數呢?以下 均基於打表 1 1e6 的基礎上完成 素數的定義就是乙個數的因子只包含1和其本身,那麼我們直接就按照定義寫 include include define maxn 1000000 10 int pri maxn int isprim...

素數篩選法

基本思想 素數的倍數一定不是素數 實現方法 用乙個長度為n 1的陣列儲存資訊 0表示素數,1表示非素數 先假設所有的數都是素數 初始化為0 從第乙個素數2開始,把2的倍數都標記為非素數 置為1 一直到大於n 然後進行下一趟,找到2後面的下乙個素數3,進行同樣的處理,直到最後,陣列中依然為0的數即為素...