素数:1でのみ除算できる数値で、それ自体を素数と呼びます。それ以外の場合は、合成数です。
素数の判定:数n、1より大きいn未満のすべての数を1つずつもたらします。いずれか1つを分割できる場合、判定は複合です。そうでない場合、それは素数です。
最適化:複合因子がペアで表示されます(n = i * j; i <jと仮定すると、iがnの因数であると判断した場合、jもnの因数であると判断します) 2からn-1までのすべての数を判断するには、2からsqrt(n)までを判断します。
bool isprim(unsigned x) { if(x < 2)return false ; 用(符号なしI = 2 ; iは<= X * I ++ ) 場合(X%I == 0)リターン 偽。 trueを返し ます。 }
場合によっては、プログラムで数値が素数かどうかを繰り返し確認する必要があります。簡単なクエリのために、判定結果を配列に保存できます。これは素数のふるい分け法です。
エールリッヒふるい法:O(n log n)、素数ではない数を選別します。12:2 * 6 = 3 * 4 = 12など、一部の数値は繰り返しフィルタリングされます。したがって、12は2と3によってフィルタリングされます。
const int maxn = 1000009 ; bool noprime [maxn]; void isprim() { memset(noprime、0、sizeof (noprime)); noprime [ 0 ] = noprime [ 1 ] = 1 ; for(int i = 2 ; i * i <maxn; i ++ ) if(!noprime [i]) for(int j = i * i; j <maxn; j + = i) noprime [j] = true ; }
オイラーふるい/線形ふるい:O(n)、素因数分解を使用すると、任意の整数は一意の素因数表現を持つため、各数値が一度だけふるい分けされることが保証されます。
const int maxn = 100009 ; int prime [maxn + 1 ]; // prime [0]用来用存素数个数 void getPrime() { memset(prime、0、sizeof (prime)); for(int i = 2 ; i <= maxn; i ++ ){ if(!prime [i])prime [++ prime [ 0 ]] = i; for(int j = 1 ; j <= prime [ 0 ] && prime [j] * i <= maxn; j ++ ){ prime [prime [j] * i] = 1; if(i%prime [j] == 0)break ; } } }