2016-12-14 1 views
0

プロジェクトオイラーの質問3を解決しようとしていますhere.エラトステンのふるいを使って素数リストを生成して解決したいのですが(here.)しかし、私は小さな問題に遭遇しました...エラトステンのふるいで素数を生成する

私はこのために取り組んできたコードですが、このコードを実行すると、コンピュータが停止し、2を出力する前に2が出力されますリストを出力する前に、私に知らせてください(ちょうどハングアップが出力の前にあるかどうかをチェックしてください)。リストを割り当てることができます。

何が起こっているのかわからない場合は、コードを掘り下げてさまざまな行をデバッグするためのポインタを教えてください。私は別の領域でConsole.WriteLineを試しましたが、コードに応答していないようです。あなたの当面の問題については

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

public class Program 
{ 
    static void Main(string[] args) 
    { 
     long maxNum = 100; 
     double maxSqrt = Math.Floor(Math.Sqrt(maxNum)); 
     long basePrime; 
     // Make a list from 2 to maxNum 
     List<long> numberList = new List<long>(); 
     List<long> sievedList = new List<long>(); 
     for (long i = 2; i <= maxNum; i++) numberList.Add(i); 
     // Evaluate the first number of the list, if it is < maxSqrt skip it, create a list of multiples and Except them from numberList, else, numberList is completely Prime Factors 

     foreach (long number in numberList.Skip(1)) 
     { 
      basePrime = numberList[0]; 
      Console.WriteLine(basePrime); 
      while (number < maxSqrt) 
       { 
        if (number % basePrime == 0) 
        { 
         sievedList.Add(number); 
        } 
        numberList = numberList.Except(sievedList).ToList(); 
        sievedList.Clear(); 
       } 
     } 
    Console.WriteLine("Finished Allocating Primes"); 
    numberList.ForEach(Console.WriteLine); 
    } 
} 
+0

maxNumが変更されない限り、maxSqrtは変更しないでください。私は数の平方根が最大であるという印象を受けています。 – RaineAndrews

+3

あなたは今、デバッガを使うことを学ぶべきです。あなたの質問をここで作成するのに要した時間よりはるかに短い時間で、あなたの 'while'ループで間違いを見つけたでしょう。コードをステップ実行することで、コードを記述するためのより良い方法について多くのことを教えることができます。 'number'は決して変更しないので、常に

+0

したがって、numberがmaxSqrtより大きくなるまでnumberが変わらないので、whileループは実際にはその値を変更しませんか? – RaineAndrews

答えて

1

ifwhileを変更します。

しかし、あなたのコードには他の問題もあります。

  • あなたnumberedListはあなたのためのループを移入している2からmaxNumまでの整数のリストだけです。次にリストを繰り返しています。代わりにforループのカウンタを使用してください。どの数字が素数であるかを記録するには、BitArray(Int32, Boolean)がうまくいきます。
  • これにより、高価なLINQ拡張を削除することもできます。非素数を見つけたら、BitArrayのインデックスを変更するだけです。素数を見つけたらリストに追加してください。
+0

ええ、以前のコメントはそれが大きな時間を指摘しました!私はそれを試してきましたが、あなたが言ったように、それは深刻な問題を抱えています。私はBitArrayを読む必要がありますが、これはゲームチェンジャーのように見えます。ありがとう! – RaineAndrews

関連する問題