プライム問題を求めてふるい高速リニア

NO1

ラピッド直線性の問題の素数を求めてスクリーニング(オイラーふるいです)

 

特長:冗長性はありませんが、繰り返しスクリーニングは番号ではありません。時間の複雑さはほぼO(n)を。

仕組み:任意の合成数の場合は、途中で最大の要因分解を乗じた最低限の品質係数がなければなりません。したがって、各複合番号ため、限り最大の要因限り最小の品質係数を列挙する列挙として、再び篩。

1つの#include <iostreamの>
 2  の#define MAXN 1000010
 3。 使用した 名前空間STD;
 4  ロングプライム[MAXN]、number_prime; //プライムnumber_primeが素数の数であり、素数の集合である
 5。 BOOL VIS [MAXN]; // VISと数が素数でないことを記録
 6。インラインボイド pd_prime(INTの数)//数が素数の制限の必要な集合である
 7。 {
 8。     ためINT I = 2 ; I <=数; I ++ 9      {
 10          IF!(VIS [I ])プライム[number_prime ++] = I; //それが素数の集合内にないと判定された場合、非素数-であり、数+ 1(ここで、別の数+1に割り当て、したがってプライム配列は0から始まります)
。11          のためのint型 J = 0 ; J <number_prime総理&& * I [J]は<=数; J ++ )// Jは素数の数が今求めて、次の画面の数未満である(私は*あり既知の素数以下上限が記載より)
 12である         {
 13は              = [iは[J]プライム*] VIS trueに、iは素数遮蔽合成数である*に//を分割することができる
 14              IF(!(I%のプライム[J]))BREAKを; //注Iの%プライム1参照[J] == 0。
 15          }
 16      }
 17  }
 18である INT )(主
 19。 {
 20は     INT N-、
 21である      CIN >> N-、
 22は     pd_prime(N)
 23である     ためINTiは= 0 ; I <number_prime; I ++)COUT <<プライム[I] << ENDL。
24      COUT << ENDL << " 総数:" << number_prime。
25      リターン 0 ;
26 }

注1:最低限の品質係数ふるいです

例:12 = 2 * 2 * 3

私は4に4、2 = *フィルタ付きストップ---

......

私は6、2〜6 * 6 * 3フィルタ済みフィルタ済み--- ---停止=とき

12 iは=のみときに画面が再度、最小素因数2である2

唯一スクリーニングQ X = I * P1即ちX = P1 * P1 * qとiは、P1をIF = *、P2 * ... *のpn P2 * ... * PNセット。残りの従事の数:X2 = P2 * P1 * Q =(P2 *、P2 * ... * PN)* P1; iが(P2 *、P2 * ... * PN)ネイチャー=これは、選別されます。

おすすめ

転載: www.cnblogs.com/cyncy/p/12081265.html