質問

を見つけていきたいの素数0の長可変ができませんも出力されます。

プログラムの

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication16
{
    class Program
    {
        void prime_num(long num)
        {
            bool isPrime = true;
            for (int i = 0; i <= num; i++)
            {
                for (int j = 2; j <= num; j++)
                {
                    if (i != j && i % j == 0)
                    {
                        isPrime = false;
                        break;
                    }
                }
                if (isPrime)
                {
                    Console.WriteLine ( "Prime:" + i );
                }
                isPrime = true;
            }
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            p.prime_num (999999999999999L);
            Console.ReadLine();
        }
    }
}

できずに教えてくれるので助かりますとか、誤差にはどうすればいいですか?

役に立ちましたか?

解決

あなたはこのようなもの(長さ)行ののほぼ最適のトライアル分割ふるいを使用してより速く、これを行うことができます

Enumerable.Range(0, Math.Floor(2.52*Math.Sqrt(num)/Math.Log(num))).Aggregate(
    Enumerable.Range(2, num-1).ToList(), 
    (result, index) => { 
        var bp = result[index]; var sqr = bp * bp;
        result.RemoveAll(i => i >= sqr && i % bp == 0); 
        return result; 
    }
);

ここで使用される素数の数の近似式は π(x) < 1.26 x / ln(x) でありますに。私たちは、x = sqrt(num) のより大きくない素数でテストする必要があります。

エラトステネスでのふるいが(実行する必要がありトライアル部門よりもはるかに優れ、実行時の複雑さを持っていることに注意してくださいはるかに高速のために大きなnum の値は、適切に実装する場合)。

他のヒント

これを試してください:

void prime_num(long num)
{

    // bool isPrime = true;
    for (long i = 0; i <= num; i++)
    {
        bool isPrime = true; // Move initialization to here
        for (long j = 2; j < i; j++) // you actually only need to check up to sqrt(i)
        {
            if (i % j == 0) // you don't need the first condition
            {
                isPrime = false;
                break;
            }
        }
        if (isPrime)
        {
            Console.WriteLine ( "Prime:" + i );
        }
        // isPrime = true;
    }
}

あなただけの数の平方根までの奇数除数をチェックする必要があります。言い換えれば、あなたの内側のループを開始する必要があります:

for (int j = 3; j <= Math.Sqrt(i); j+=2) { ... }

また、すぐにあなたは数が素数ではありません見つけるとしての機能から抜け出すことができ、あなたは任意のより多くの約数をチェックする必要はありません(私はあなたがすでにそれをやっている参照してください!)。

numが2よりも大きい場合にのみ動作します。

なしのSqrt

あなたは、実行中の合計を維持することにより、完全のSqrtを回避することができます。たとえばます:

int square_sum=1;
for (int j=3; square_sum<i; square_sum+=4*(j++-1)) {...}
数値の和1+(3 + 5)+(7 + 9)あなたの奇数の正方形の配列(1,9,25など)を与えるので、

です。それゆえjsquare_sumの平方根を表します。限りsquare_sumi未満であるように、その後j平方根未満である。

人以上のカップルのビルブロックに向けてこれを効率的に、誰も本当の作品です。の ふるいのEratosthenes 始めてくださいがいしょうの記憶 前に上限に達しています。思いので無駄なものがいっループ、アカウントを主因子.とができ開始にふるいにベースを作成するつの因子を使用し、そのループ試験数値.

書くときにループしかし、まったくないおsqrt(i)のループ条件としてカップルの答えが考えられる。いのを知っているsqrtは"純粋な"機能にて、常に同じ答えが変更されていない場合は、同じ入力パラメータとします。残念ながら、コンパイラを知らないことなので、使うことのように'<=Math.sqrt(x)'のループ条件で再計算にsqrtの番号毎に繰り返し処理のループを実行します。

できることを避けるカップルの動かし方が異なります。また事前の計算にsqrt前のループは、使用前計算値のループ条件、仕事をしたりできます他の方向の変更 i<Math.sqrt(x)i*i<x.個人的には、事前に計算さの平方根が--だと思うのよね速がることができる反復回数のループの i*i というの倍のループ).少数の繰り返し, i*i 通常、高速に行います。十分な反復、その損失から i*i 毎繰り返すほどの時間を実行する sqrt を一度外側のループを実行します。

ことになるだろう十分なサイズの数だけを扱う--15桁の限界の平方根で7~8桁の合致が見られ、かなりリーズナブル量のメモリを消費します。一方で、たい場合の対応番号をこの範囲を多くするためのより洗練された盛り-チェックアルゴリズムなど ポーランドまたはブレントのアルゴリズム.これらの複雑に入れて弱)で 多く がなくなります。

ありその他のアルゴリズムでも大きな数次のふるい, 一般に数分野ふるい ものまんまのためにそれほど苦しんでいる時に、"いく複雑になり、ちょっとだけで使用で対応も大きな数字のGNFS始めに役立てることができる100+桁用いられています。

最初のステップ: 書拡張手法を見出場合には入力が盛り

public static bool isPrime(this int number ) {

    for (int i = 2; i < number; i++) { 
        if (number % i == 0) { 
            return false; 
        } 
    }

    return true;   
}

2ステップ: 記入方法まですべて印刷素数が0の番号を入力

public static void getAllPrimes(int number)
{
    for (int i = 0; i < number; i++)
    {
        if (i.isPrime()) Console.WriteLine(i);
    }
}

それはちょうど私の意見かもしれないが、あなたのプログラム内の別の重大なエラー(徹底的に回答されている与えられた「素数」の質問に、脇設定)があります。

応答者の残りの部分と同じように、私はあなたが開発者(おそらく)になりたいと思って示しており、これは宿題であると仮定しています。

あなたはあなたのコードを区分することを学ぶ必要があります。それはあなたが常にプロジェクトで行う必要がありますものではないのですが、それはそれを行う方法を知って良いことだ。

あなたの方法のprime_num(ロングNUM)は、より良い、より説明的な名前を立てることができます。それは与えられた数よりも、すべての素数少ない見つけることになっている場合、それはリストとしてそれらを返す必要があります。これは、簡単にお使いのディスプレイや、あなたの機能を区切るになります。

それは単にまたはラインの下のさらなる計算でそれらを使用する(おそらくかなりそれらを印刷するために、別の外部の関数を呼び出す)。あなたは、あなたのメイン機能でそれらを表示することができ素数を含むのIListを返した場合は、

だから、あなたに私の最高の勧告は、このような何かを行うことです。

public void main(string args[])
{
    //Get the number you want to use as input
    long x = number;//'number' can be hard coded or retrieved from ReadLine() or from the given arguments

    IList<long> primes = FindSmallerPrimes(number);

    DisplayPrimes(primes);
}

public IList<long> FindSmallerPrimes(long largestNumber)
{
    List<long> returnList = new List<long>();
    //Find the primes, using a method as described by another answer, add them to returnList
    return returnList;
}

public void DisplayPrimes(IList<long> primes)
{
    foreach(long l in primes)
    {
        Console.WriteLine ( "Prime:" + l.ToString() );
    }
}
あなたはこのようなsperationが必要とされていないどこかの作業を終了している場合でも、

、それはそれを行う方法を知って良いことだ。

EDIT_ADD: さすらしさが正しいことを質問の目的は、あくまでも出力での連続ストリームの素数とプログラムの実行(を押す一時停止/休憩を一時停止および任意のキーで開始しない深刻ないのきる上限のコード書き込まれない上限の引数、範囲のチェック"true"の"i"のためのループを実行します。一方、このため実際に印刷の素数に限界があるので、これにより,以下のようなコードの仕事を効率よく試課に限の奇数のとを使用しませんのでお客様のニーズというのは、非常なりますので注意してください(もに変換する継続的なループとしては、上)

static void primesttt(ulong top_number) {
  Console.WriteLine("Prime:  2");
  for (var i = 3UL; i <= top_number; i += 2) {
    var isPrime = true;
    for (uint j = 3u, lim = (uint)Math.Sqrt((double)i); j <= lim; j += 2) {
      if (i % j == 0)  {
        isPrime = false;
        break;
      }
    }
    if (isPrime) Console.WriteLine("Prime:  {0} ", i);
  }
}

第一に、質問コードを生まない出力がそのループ変数が整数に制限の試験は長整数を意味することができなループの上限を製造する内部ループ 編集: 各変数の"j'ループに戻る負の数;場合に"j'変数が約が-1の試験番号に失敗したの試験でのすべての数均等割り-1 END_EDIT.する場合であってもたのを修正し、質問コードの生産は非常に遅く出力で取得し有機的に結合し、この64ビット部門で大量に複数の記録が残っており、それプラス、複合材)の全体の数値の範囲まではその数十の島電力の各相である。上記のコードの作品が制限されていて、計算の奇数番号のみなmodulo部門の平方根 現在の数が試されている.

この時間で表示する素数、億円、こちらの暑さにもだいぶ慣れてき時間がかかると思うるすべての素数十千兆(10の第力)、特にとしての計算の動きが遅くなり増加。 END_EDIT_ADD

その一つにライナー(回答@SLaks用Linqの作品で最初がやりたかっただけで、ふるいのEratosthenesではunoptimised版 試作部門,unoptimisedが排除されるわけではない奇素数んに始まるスクエアに拠点盛り、停止しないので処分をベースより大きい素数の平方根の番号へ着きがある。でもなかなかの入れ子になった複数の列挙。

では実際には、虐待のLinq集計方法な有効利用はLinq範囲の生成されます。しますので最適化された試験事業部の少ない列挙架下

static IEnumerable<int> primes(uint top_number) {
  var cullbf = Enumerable.Range(2, (int)top_number).ToList();
  for (int i = 0; i < cullbf.Count; i++) {
    var bp = cullbf[i]; var sqr = bp * bp; if (sqr > top_number) break;
    cullbf.RemoveAll(c => c >= sqr && c % bp == 0);
  } return cullbf; }

走る多くの倍以上のSLaksの答えです。しかし、まだ遅く、メモリの集中によるリストを複数の列挙はどの複数に分割(暗黙のmodulo)。

以下の真のふるいのEratosthenes実施運行約30倍の速度で、少ない記憶としていてアフターサービスについては、一つのビット表現に一番ふと限界、その列挙への最後の反復子シーケンス出力としてのoptimisationsのみの処理の奇複合材料、淘汰からの正方形のベース素数ベース素数の平方根の最大数として

static IEnumerable<uint> primes(uint top_number) {
  if (top_number < 2u) yield break;
  yield return 2u; if (top_number < 3u) yield break;
  var BFLMT = (top_number - 3u) / 2u;
  var SQRTLMT = ((uint)(Math.Sqrt((double)top_number)) - 3u) / 2u;
  var buf = new BitArray((int)BFLMT + 1,true);
  for (var i = 0u; i <= BFLMT; ++i) if (buf[(int)i]) {
      var p = 3u + i + i; if (i <= SQRTLMT) {
        for (var j = (p * p - 3u) / 2u; j <= BFLMT; j += p)
          buf[(int)j] = false; } yield return p; } }

上記のコードを計算すべての素数千万の範囲は約77ミリ秒単位のインテル-i7-2700K(3.5GHz)です。

のいずれかのstaticメソッドを呼び試験に使用諸表の静主な方法として

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

static void Main(string[] args) {
  Console.WriteLine("This program generates prime sequences.\r\n");

  var n = 10000000u;

  var elpsd = -DateTime.Now.Ticks;

  var count = 0; var lastp = 0u;
  foreach (var p in primes(n)) { if (p > n) break; ++count; lastp = (uint)p; }

  elpsd += DateTime.Now.Ticks;
  Console.WriteLine(
    "{0} primes found <= {1}; the last one is {2} in {3} milliseconds.",
    count, n, lastp,elpsd / 10000);

  Console.Write("\r\nPress any key to exit:");
  Console.ReadKey(true);
  Console.WriteLine();
}

るまでの素数の配列の制限、最後に盛りの時間を伸列挙する。

EDIT_ADD: しかしを生み出すためには、その列挙件数素数未満万兆円(十世紀の電力)の問いう、分割ページごとに区切の実用的なマルチコア処理が必要なものとC++の 非常に高度に最適化されたPrimeSieve, 必要となっ400時間だけの数が素数が見つからないのか、何十倍も長い列挙しい一年以上いう問いるのです。い、国連で最適化された試験事業部アルゴリズムと、スーパーが紀元と非常に長い時間を使用してもよく最適化された試験事業部アルゴリズムなどのようなものにつきましては百万分の電力を年間(二百万ゼロ年!!!).

ではないかというのは不思議なことに彼のデスクトップ機で土の行き詰ったです。また小さい範囲など百万円、ただいたので、秒を実装します。

に掲載していまここにい切ってからではないとも最後のふるいのEratosthenesつの要約640テラバイトのメモリ。

こだけページ分割手法などのPrimeSieve対応できるこのような問題の範囲を指定した全てのものを入れることによって行われる非常に長い時間、週間のお時間年間のいずれかの場合を除いて、アクセスできるスーパーコンピュータに何十万ものコアを用いた END_EDIT_ADD

より多くの宿題のようなにおいがします。私は非常に非常に古いグラフ電卓は、このようなプライムプログラムでいました。 TechnnicallyインナーディビジョンチェックループはI ^(1/2)を実行する必要があります。あなたは0とLの間で「すべて」素数を見つける必要がありますか?他の主要な問題は、あなたの入力データが、これはあなたのループは一度も実行に失敗することオーバーフローを引き起こしているだろう、「長い」である間、あなたのループ変数は「int型」であるということです。ループ変数を修正します。

C位の1つのラインコード: -

Console.WriteLine(String.Join(Environment.NewLine, 
    Enumerable.Range(2, 300)
        .Where(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1)
        .All(nn => n % nn != 0)).ToArray()));                                    

エラトステネスのhref="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" rel="nofollow">ふるいは、上記答える

private static IEnumerable Primes01(int num)
{
    return Enumerable.Range(1, Convert.ToInt32(Math.Floor(Math.Sqrt(num))))
        .Aggregate(Enumerable.Range(1, num).ToList(),
        (result, index) =>
            {
                result.RemoveAll(i => i > result[index] && i%result[index] == 0);
                return result;
            }
        );
}
このリストは素数の最終的なリストを含むことになるので、

骨の種子はNUMの範囲1であるべきです。 Enumerable.Range(1, Convert.ToInt32(Math.Floor(Math.Sqrt(num))))はシードがパージされた回数です。

なので基本的には で誤字, いるのを下の単語から選ぶ問題で最も残念 for (int j = 2; j <= num; j++) の理由のための非生産的な試験 1%2,1%3 ... 1%(10^15-1) るなど地域の見所があり非常に長い時間のOPん "他の出力". でって j < i; です。 のその他小に比べ、 i 開始から2は0:

for( i=2; i <= num; i++ )
{
    for( j=2; j < i; j++ ) // j <= sqrt(i) is really enough
....

るのではないかできないと合理的に期待される コンソール印刷 28兆素数でに完成する合理的時間-フレーム。なので、内容に問題が明らかに印刷して着実なストリームの素数, 無期限.よって、全ての解決策の提案を簡単に利用ふるいのEratosthenesは全くないメリットで、ここで 簡単な ふるいのEratosthenes囲-制限の設定が必要です。

何がここでは最適化された試験事業部を節約することを素数としてできるようにするためのlibsoupおよび試験に対する素数だけでなく、すべての数以下になる。

二つ目は、より複雑性(より速い)を使用 分割ふるいのEratosthenes.は漸増および無限.

両方のこれらの制度をご利用い ダブル-演出産の素数:一作で保存して素数を使用するその他のステージ試験(ふるい)は、上記の制限の最初のステージ(以下、スクエアのコースを自動的に延長、第二段階としていくと考えられます。

はかなり率直に言って、提案の解決策のいくつかは本当に遅いですので、悪い提案です。プライムように、単一の番号をテストするためには、いくつかの分割/剰余演算を必要としますが、範囲を計算するためにあなたがする必要はありません。

基本的にはちょうど自分自身をプライムない(定義)されると、以前見つかった素数の倍数の数字を除外します。

私はそれが簡単になりますように、これは擬似コードでアプローチがあり、完全な実装を与えることはありません。 (私のマシンでは、実際の実装は、8秒以内にSytem.Int32(2 bilion)内のすべての素数を計算します。

public IEnumerable<long> GetPrimes(long max)
{
    // we safe the result set in an array of bytes.
    var buffer = new byte[long >> 4];
    // 1 is not a prime.
    buffer[0] = 1;

    var iMax = (long)Math.Sqrt(max);

    for(long i = 3; i <= iMax; i +=2 )
    {
        // find the index in the buffer
        var index = i >> 4;
        // find the bit of the buffer.
        var bit = (i >> 1) & 7;

        // A not set bit means: prime
        if((buffer[index] & (1 << bit)) == 0)
        {
            var step = i << 2;
            while(step < max)
            {
                // find position in the buffer to write bits that represent number that are not prime.
            }
        }
        // 2 is not in the buffer.
        yield return 2;

        // loop through buffer and yield return odd primes too.
    }
}

ソリューションは、ビット単位演算の十分な理解が必要です。しかし、それの方法、および高速化方法。また、あなたは後で使用するためにそれらを必要とする場合は、ディスク上の成果を安全になります。 17個の* 10 ^ 9つの数字の結果を1 GBのリコールセーフ、その結果セットの計算は約2分maxをとることができる。

私は、これは静かな古い質問ですが、ここで読んだ後に知っています: のふるいエラトステネスウィキ

これは、私は、アルゴリズムを理解することから、それを書いた方法です。

void SieveOfEratosthenes(int n)
{
    bool[] primes = new bool[n + 1];

    for (int i = 0; i < n; i++)
        primes[i] = true;

    for (int i = 2; i * i <= n; i++)
        if (primes[i])
            for (int j = i * 2; j <= n; j += i)
                primes[j] = false;

    for (int i = 2; i <= n; i++)
        if (primes[i]) Console.Write(i + " ");
}

最初のループでは、真とブール値の配列を埋めます。

ループのための第二は素数ではありません2 1以降から開始され、素数はまだ変更されていないかどうかを確認してから、jのインデックスに偽が割り当てられます。

それが素数であるとき、私たちは

最後のループを印刷します。

非常に類似した - C#でエラトステネスのふるいを実装するための運動から:

public class PrimeFinder
{
    readonly List<long> _primes = new List<long>();

    public PrimeFinder(long seed)
    {
        CalcPrimes(seed);
    }

    public List<long> Primes { get { return _primes; } }

    private void CalcPrimes(long maxValue)
    {
        for (int checkValue = 3; checkValue <= maxValue; checkValue += 2)
        {
            if (IsPrime(checkValue))
            {
                _primes.Add(checkValue);
            }
        }
    }

    private bool IsPrime(long checkValue)
    {
        bool isPrime = true;

        foreach (long prime in _primes)
        {
            if ((checkValue % prime) == 0 && prime <= Math.Sqrt(checkValue))
            {
                isPrime = false;
                break;
            }
        }
        return isPrime;
    }
}

総理ヘルパー非常に高速な計算

public static class PrimeHelper
{

    public static IEnumerable<Int32> FindPrimes(Int32 maxNumber)
    {
        return (new PrimesInt32(maxNumber));
    }

    public static IEnumerable<Int32> FindPrimes(Int32 minNumber, Int32 maxNumber)
    {
        return FindPrimes(maxNumber).Where(pn => pn >= minNumber);
    }

    public static bool IsPrime(this Int64 number)
    {
        if (number < 2)
            return false;
        else if (number < 4 )
            return true;

        var limit = (Int32)System.Math.Sqrt(number) + 1;
        var foundPrimes = new PrimesInt32(limit);

        return !foundPrimes.IsDivisible(number);
    }

    public static bool IsPrime(this Int32 number)
    {
        return IsPrime(Convert.ToInt64(number));
    }

    public static bool IsPrime(this Int16 number)
    {
        return IsPrime(Convert.ToInt64(number));
    }

    public static bool IsPrime(this byte number)
    {
        return IsPrime(Convert.ToInt64(number));
    }
}

public class PrimesInt32 : IEnumerable<Int32>
{
    private Int32 limit;
    private BitArray numbers;

    public PrimesInt32(Int32 limit)
    {
        if (limit < 2)
            throw new Exception("Prime numbers not found.");

        startTime = DateTime.Now;
        calculateTime = startTime - startTime;
        this.limit = limit;
        try { findPrimes(); } catch{/*Overflows or Out of Memory*/}

        calculateTime = DateTime.Now - startTime;
    }

    private void findPrimes()
    {
        /*
        The Sieve Algorithm
        http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
        */
        numbers = new BitArray(limit, true);
        for (Int32 i = 2; i < limit; i++)
            if (numbers[i])
                for (Int32 j = i * 2; j < limit; j += i)
                     numbers[j] = false;
    }

    public IEnumerator<Int32> GetEnumerator()
    {
        for (Int32 i = 2; i < 3; i++)
            if (numbers[i])
                yield return i;
        if (limit > 2)
            for (Int32 i = 3; i < limit; i += 2)
                if (numbers[i])
                    yield return i;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    // Extended for Int64
    public bool IsDivisible(Int64 number)
    {
        var sqrt = System.Math.Sqrt(number);
        foreach (var prime in this)
        {
            if (prime > sqrt)
                break;
            if (number % prime == 0)
            {
                DivisibleBy = prime;
                return true;
            }
        }
        return false;
    }

    private static DateTime startTime;
    private static TimeSpan calculateTime;
    public static TimeSpan CalculateTime { get { return calculateTime; } }
    public Int32 DivisibleBy { get; set; }
}
    public static void Main()
    {  
        Console.WriteLine("enter the number");
        int i = int.Parse(Console.ReadLine());

        for (int j = 2; j <= i; j++)
        {
            for (int k = 2; k <= i; k++)
            {
                if (j == k)
                {
                    Console.WriteLine("{0}is prime", j);

                    break;
                }
                else if (j % k == 0)
                {
                    break;
                }
            }
        }
        Console.ReadLine();          
    }
static void Main(string[] args)
    {  int i,j;
        Console.WriteLine("prime no between 1 to 100");
    for (i = 2; i <= 100; i++)
    {
        int count = 0;
        for (j = 1; j <= i; j++)
        {

            if (i % j == 0)
            { count=count+1; }
        }

        if ( count <= 2)
        { Console.WriteLine(i); }


    }
    Console.ReadKey();

    }

Uがなければならない2つだけの要素(1自体)通常の素数の概念を使用することができます。 したがって、このように行う、簡単な方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PrimeNUmber
{
    class Program
    {
        static void FindPrimeNumber(long num)
        {
            for (long i = 1; i <= num; i++)
            {
                int totalFactors = 0;
                for (int j = 1; j <= i; j++)
                {
                    if (i % j == 0)
                    {
                        totalFactors = totalFactors + 1;
                    }
                }
                if (totalFactors == 2)
                {
                    Console.WriteLine(i);
                }
            }
        }

        static void Main(string[] args)
        {
            long num;
            Console.WriteLine("Enter any value");
            num = Convert.ToInt64(Console.ReadLine());
            FindPrimeNumber(num);
            Console.ReadLine();
        }
    }
}

この溶液を0と100の間のすべての素数を表示する

        int counter = 0;
        for (int c = 0; c <= 100; c++)
        {
            counter = 0;
            for (int i = 1; i <= c; i++)
            {
                if (c % i == 0)
                { counter++; }
            }
            if (counter == 2)
            { Console.Write(c + " "); }
        }

これは、C#で素数を計算するための最速の方法です。

   void PrimeNumber(long number)
    {
        bool IsprimeNumber = true;
        long  value = Convert.ToInt32(Math.Sqrt(number));
        if (number % 2 == 0)
        {
            IsprimeNumber = false;
        }
        for (long i = 3; i <= value; i=i+2)
        {             
           if (number % i == 0)
            {

               // MessageBox.Show("It is divisible by" + i);
                IsprimeNumber = false;
                break;
            }

        }
        if (IsprimeNumber)
        {
            MessageBox.Show("Yes Prime Number");
        }
        else
        {
            MessageBox.Show("No It is not a Prime NUmber");
        }
    }
class CheckIfPrime
   {
    static void Main()
      {
          while (true)
        {
            Console.Write("Enter a number: ");
            decimal a = decimal.Parse(Console.ReadLine());
            decimal[] k = new decimal[int.Parse(a.ToString())];
            decimal p = 0;
            for (int i = 2; i < a; i++)
            {
                if (a % i != 0)
                {
                    p += i;
                    k[i] = i;
                }
                else
                    p += i;
            }
            if (p == k.Sum())
               { Console.WriteLine ("{0} is prime!", a);}
            else
               {Console.WriteLine("{0} is NOT prime", a);}

        }
    }

}

のアルゴリズムを実装するためのいくつかの非常に最適な方法があります。しかし、あなたは数学について多くを知らないと、あなたは、単に要件としてプライムの定義に従えば: 1によると、それ自体(何もない)によってのみ割り切れる数は、ここでは正の数のコードを理解することは簡単です。

public bool IsPrime(int candidateNumber)
{
    int fromNumber = 2;
    int toNumber = candidateNumber - 1;

    while(fromNumber <= toNumber)
    {
        bool isDivisible = candidateNumber % fromNumber == 0;
        if (isDivisible)
        {
            return false;
        }

        fromNumber++;
    }
    return true;
}

すべての数は1で、それ自体で割り切れるので、我々は以降すぐに自身の前の数字まで2からチェックを開始。それは基本的な推論だ。

また、これを行うことができます

class Program
  {
    static void Main(string[] args)
    {
      long numberToTest = 350124;
      bool isPrime = NumberIsPrime(numberToTest);
      Console.WriteLine(string.Format("Number {0} is prime? {1}", numberToTest, isPrime));
      Console.ReadLine();
    }

    private static bool NumberIsPrime(long n)
    {
      bool retVal = true;

      if (n <= 3)
      {
        retVal = n > 1;
      } else if (n % 2 == 0 || n % 3 == 0)
      {
        retVal = false;
      }

      int i = 5;

      while (i * i <= n)
      {
        if (n % i == 0 || n % (i + 2) == 0)
        {
          retVal = false;
        }
        i += 6;
      }

      return retVal;
    }
  }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top