素數篩就是標記所求範圍內的數字是否是合數、沒有被標記的為合數
具體步驟:用乙個陣列 a[ i ] 標記 i 是否是合數,是 a[ i ] 為 1 ,否則 a[ i ] 為 0 ;若 i 為素數則在所求範圍內的 i 的整數倍 a[ k * i ] 全標記為 1 。
如: 第一次標記到 2 為素數,則 2 的整數倍 4, 6, 8 …均標記為合數,從 2 往後找到 3 未被標記,則 3 為素數,再將 3 的整數倍 6, 9 ,12 ,15 … 標記為合數,再從 3 往後,找到 5 未被標記,5 為素數,將 5 的整數倍 10, 15,20,25 …標記為合數,以此類推。
**實現:
#include
#define n 100
//求 100 以內的素數
int a[n]=;
intinit()
}return0;
}int
main()
}return0;
}
通過前面素數篩的**可以發現,如 6,10,15,18這類數同時是幾個素數的正整數,就會被重複標記,造成了不必要的時間浪費,線性篩則解決了這一問題。
具體步驟:對於乙個合數 p 將其分解為 m x n,n 為 p 的最小素數因子,m >= n。通過 m x n 標記 p 就只標記一次。
#include
#define n 100
//求 100 以內的素數
int a[n]=;
intinit()
}return0;
}int
main()
return0;
}
素數篩法(素數篩 線性篩)
求素數的方法在現階段可以總結為三種 這種方法最為簡單但效率太低,經過優化時間複雜度最低是o n sqrt n 輸入乙個n,輸出n以內所有素數 include intprime int n if flag 0 優化 printf d i intmain 素數篩法原理 2是素數,那麼2的所有倍數都是合數...
素數線性篩
ps 證明 神牛部落格。include include using namespace std const int n 100100 int v n p n n,m,tot int main 首先,先明確乙個條件,任何合數都能表示成一系列素數的積。不管 i 是否是素數,都會執行到 關鍵處1 如果 i...
線性篩素數
如題,給定乙個範圍n,你需要處理m個某數字是否為質數的詢問 每個數字均在範圍1 n內 輸入格式 第一行包含兩個正整數n m,分別表示查詢的範圍和查詢的個數。接下來m行每行包含乙個不小於1且不大於n的整數,即詢問該數是否為質數。輸出格式 輸出包含m行,每行為yes或no,即依次為每乙個詢問的結果。in...