プロジェクトオイラーの質問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);
}
}
maxNumが変更されない限り、maxSqrtは変更しないでください。私は数の平方根が最大であるという印象を受けています。 – RaineAndrews
あなたは今、デバッガを使うことを学ぶべきです。あなたの質問をここで作成するのに要した時間よりはるかに短い時間で、あなたの 'while'ループで間違いを見つけたでしょう。コードをステップ実行することで、コードを記述するためのより良い方法について多くのことを教えることができます。 'number'は決して変更しないので、常に
したがって、numberがmaxSqrtより大きくなるまでnumberが変わらないので、whileループは実際にはその値を変更しませんか? – RaineAndrews