A:エラトステネスのふるい(エラトステネスのふるい)
1.アルゴリズムの基本的な考え方:
場合の数が素数である、その倍数確かに非品質、リニアテーブルは、テーブルの品質のノンマーキングを再生するには、事前に定義された方法を使用して、残りの数が素数です。
2.選択プロセス:
//#含める<ビット/ STDC ++。H> の#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> 書式#include <文字列> の#include <CStringの> 書式#include <stdio.hに> する#include <キュー> の#include <スタック>。 #include <マップ> の#include <セット> の#include <のctype.h> の#include <string.hの> する#include <ベクトル> の#define ME(x、y)はmemsetの(X、Y、はsizeof(X)) の#define SF(N)のscanf( "%d個"、&N) (INTのための#define担当者(I、N)は、i = 0; iは<N。 typedefの長いロングLL、 CONST INT MOD = 1E9 + 7; constの整数N = 100009; INT VIS [N]; int型A [N]; //素数テーブル INTメイン() { VIS [1] = 0; のための(INT I 2 =; I <= N ; iは++)// 素数としてマーク VIS [I] = 1; INT M =フロア(SQRT(N)+0.5); のための(INT I = 2; I <= M、I ++ ) { IF(VIS [I]) { (INT J = I * Iため; J <= N; J + = I) { VIS [J] = 0; //使用素数の倍数複合フィルタです } } } L = 0 INT; のための(INT I = 1; I <= N; I ++) { IF(VIS [I]) { [L ++] = I。 coutの<< I <<てendl; } } 0を返します。 }
概要:エラトステネスは、高効率ながら、しかし、エラトステネスは無駄な努力の多くを行っスクリーニング方法スクリーニング、数が数倍に上映されます、前回の複雑さは、平均プライムについてO(nloglogn)、あるアルゴリズムすでにの面で非常に効率的ではなく、オイラースクリーニング時間計算は、O(N)です。
II:オイラースクリーニング
1.アルゴリズムの基本的な考え方:
私割り切れるプライム[j]は、その後、私は総理[J + 1] *はこの合成数が素数[j]がされていなければならないときに、プライム、プライム配列はインクリメントされ選別いくつかの数を乗じました。
私はプライム[j]を含んでいるので、プライム[J ] [J + 1]は、プライムよりも小さくなっています。次の素数共感。だから私は、画面上で行っていません。
私は%PRME == [j]の前に0を満足し、第1の条件が変化し、プライム[j]はプライム[J]でなければならないとき、この条件が満たされている* I最小品質係数。
//#含める<ビット/ STDC ++。H> の#include <cstdioを> する#include <CStringの> する#include <cmath> の#include <アルゴリズム> の#include <iostreamの> する#include <アルゴリズム> の#include <iostreamの> する#include <cstdioを> 書式#include <文字列> の#include <CStringの> 書式#include <stdio.hに> する#include <キュー> の#include <スタック>。 #include <マップ> の#include <セット> の#include <のctype.h> の#include <string.hの> する#include <ベクトル> の#define ME(x、y)はmemsetの(X、Y、はsizeof(X)) の#define SF(N)のscanf( "%d個"、&N) (INTのための#define担当者(I、N)は、i = 0; iは<N。 ロングロングLLのtypedef、 CONST INT MOD = 1E9 + 7; constの整数N = 100009; INT VIS [N]; int型A [N]; //素数テーブル INTメイン() { VIS [1] = 0 ; のための(INT I = 2; I <= N; Iは++)//素数としてマーク VIS [I] = 1; INT L = 0; のための(INT I = 2; I <= N; I ++) { IF( VIS [I]) { A [L ++] = I; } (INT J = 0; J <L && I * A [J] <= N; J ++) { VIS [A [J] * I] = 0; (I%[j]の場合 == 0)ブレークする; // すべての複合数が最小の品質係数のふるいであろう } } のための(INT I = 0; I <L、I ++) COUT << [I] << ENDL。 0を返します。 }