番号を探していることは素数であります

------------ ------------復元コンテンツが始まります

数を求めていることは、いくつかの参考のため下に記載されている多くの解決方法がある素数であるかどうか

まず、発見のための一般的な方法

  アイデアは:nまでのルートまでのサイクル、サイクル2が開始さを追求します。

       なぜのみn個のルートを決定する必要がありますか?

    N =√N*√N、N因子√N添加ので、他のものは、対で存在し、より少ない√N√Nよりもより大きくなければなりません。

   仮定nは素数ではない、(N自体ではない)、次いでNそれに対応√N倍未満でなければならない√Nより因子大きいがあります。これは比較的簡単です。

 

 

 時間計算量はO(N)です。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INT sushu(INT N)
{ 
  場合(N == 1を返す 0 int型のk; 
  K = SQRT(N)。
  INT iは= 2 ; I <= K I ++ 
  { 
    場合(N%I == 0戻り 0 ; 
  } 
  を返す 1 
} 
int型のmain()
{ 
  int型のn;
  一方、(CIN >> N)
  {
    INT L = sushu(N)。
    もし(L)のprintf(" トゥーレ\ n " );
    他の
    { 
      のprintf(" なし\ N " ); 
    } 
  } 
  戻り 0 

}

第二に、素数は、決定ふるいです。(これは、ビット過剰であるが、大規模なデータや缶用よいです)

     素数のふるいふるい、エジプトは、リニアふるいに分けることができます。

  1エジプトふるいです。

  これは、素数がタイムアウトし、素数のようなので、唯一の画面は、素数のみを選別素数際には、いくつかの倍数でふるいメッシュになります。これは、すべて彼のマークの倍数が合成数である、素数を見つけることです。しかし、あなたは、いくつかの数字は、2のように数回、マークされ、3が12でマークされているが、これは時間の無駄になることがわかります。(データは、その後1E9であれば一般的に、そして、これに伴いに、時間計算量はnloglognあります)。

         テンプレートは以下のとおりであります:

    

const  int型 N = 1E7 + 1。;
 intは総理[N]; //プレイテーブル、テーブルはプライム負わせ、レコードの範囲内でのすべての素数である
 int型[N] B; //同等のバケットソートは、元々記録されていますプライムマークは、およびその後スクリーニングの行にスキップします。
INT CNT = 0、MAX1 = 1E7;
 INT のinit()
{ 
    memsetの(B、1はsizeof (B))、全て初期化// B [N]配列1; 
    B [ 0 ] = B [ 1。 =] 0 ;
     のためにint型 I = 2 ;私は<= MAX1; I ++ )//素数を探し始めます。
    { 
        IF (B [I])//プライムマークは最初複数のタグにこの番号バックので、表示され、その後、スキップの多重数が再び遭遇
        {
            プライム[  ++ CNT =I; //テーブルを再生する
ためのINT J = 2、J * I <= MAX1; J ++ )この複数のタグ(I)の//数 { B [I * J] = 0 ; } } } 戻り 0 ; }

一般的にエジプトふるい十分と。

 図2に示すように、線形ふるいです

 素数のふるいを大幅に時間が素数を必要削減しつつ、ふるい方法線形、共通の最適化され、実際にはまだ、このような2×3 = 6、として素数を多くの反復操作を行うことができる場合に再び画面、素数3それが再びスクリーニングするとき。唯一の画面は以下の素数の積素数IとIに等しい以上の場合、両方のスクリーニングを繰り返すことはありません、彼らは見逃すことはありません。時間の複雑さは、ほぼ線形です。の(線形範囲は、ふるいプライム2E9でスクリーニングすることができます)

  コードの場合:

CONST  INT N = 1E7 + 1 int型のプライム[N];
INT B [N]。
int型 CNT = 0、MAX1 = 1E7;
INT のinit()
{ 
    memsetの(B、1はsizeof (b)参照)。
    B [ 0 ] = B [ 1 ] = 0 ;
    以下のためにINT iが= 2 ; I <= MAX1; I ++ 
    { 
        場合(B [i])と
        プライム[ ++ CNT] = I。
        以下のためのint型 J = 1 ; J <= CNT &&プライム[J] * I <= MAX1; J ++
        { 
            B [プライム[J] * I] = 0 ;
            もし(I%プライム[J] == 0ブレーク
        } 

    } 
    戻り 0 
}

私たちは、1からnまでの素数を選別したいし、最初のデフォルト彼らはすべての素数、最外層の列挙
1の数nにすべての、
それが素数であれば、それは、素数のリストに追加され                                                                                          
、iの各列挙のために、金私素数のテーブルのために、彼らは彼らの素数をマークする
数が素数、(ない素数の素数の倍数)ではありません回
停止する列挙プライムテーブル?最低限の品質係数iを列挙は、マークがストップを完了することができ
、それぞれの番号が唯一の彼の最年少素因数が選別されていることを確認してください。
例えば:私は、外側層15、素数のリスト=:2,3,5,7,11,13
2 * 15 = 30、選別30と、3×15 = 45、45選別を15%3なぜなら== 0、バック
ループの内側のうち、
図3は、15の最も小さい素数であるので、15篩3は、アウトです。

素数を決定する方法 - 3、エジプト、線形ふるいスクリーンは、次のステップは、メインコースであることを知っています。

SQRT判別O(√N))
xが2の倍率として表すことができる場合
、X = A * Bと仮定<= B
、次いでX> A * A =
<=√x
のみ列挙<=√xオンそれは

INT sushu(長い N)
{ 
    int型フラグ= 0 以下のためにINT iが= 1 ;プライム[I] <SQTR(N); I ++ 
    { 
        場合(N%プライム[I] == 0){フラグ= 1ブレーク;} 
    } 
    もし、(N == 1)フラグ= 1 リターンフラグ。
}

そして、メイン関数init()を書き込んでください。呼び出しに成功しました。

例えば:

Lvfeihongshouする必要があり、かどうかを知るための知識がありません

問題:1704

時間制限:1000ミリ秒

メモリ制限:165535K

説明

女性の歌は、いつ結婚し、男性の満足度(満足度=富値+ステータス値-私の母の暴力の値)を調査するために
満足感が素数である場合を、あなたは結婚する、または結婚に同意することはできません。

入力

最初の行は、N(= 1 <= N < 50)、 データセットの数を示し、
n行続いて、各ラインを3つの正の整数で、X、Y、Z(富値、ステータス値、暴力の値);( 1 <= X、Y、Z <= 1E14)

出力

あなたは結婚に同意することができた場合は、出力「はい」、
そうでない場合は、出力が「ノー」。

サンプル入力

2 
10 2 1 
10 2 2

サンプル出力

はい
NO 
------------------------------------------------ ------
これは典型的な素数でふるいです
素数筛就行,因为是1e14,所以筛到1e7就行!
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e7+1;
int prime[N];int b[N];
int cnt=0,max1=1e7;
int init(){
    memset(b,1,sizeof(b));
    b[0]=b[1]=0;
    for(int i=2;i<=max1;i++)
    {
        if (b[i])
        prime[++cnt]=i;
         //for(int j=2;j*i<=1000;j++)
          //b[i*j]=0;

         for(int j=1;j<=cnt&&prime[j]*i<=max1;j++)
            {
                b[prime[j]*i]=0;
                if (i%prime[j]==0) break;
            }



    }

    return 0;}
int su(LL n){
    int flag=0;
    for(int i=1;prime[i]<=sqrt(n*1.0);i++)
    if (n%prime[i]==0) {flag=1;break;}
    if (n==1) flag=1;
    return flag;}
int main(){     int n;     LL x,y,z;     init();     cin>>n;     while(n--)     {       cin>>x>>y>>z;       if (su(x+y-z)==0) cout<<"yes"<<endl;       else             cout<<"no"<<endl;     }     return 0;}

 

おすすめ

転載: www.cnblogs.com/zhuyukun/p/12380063.html