2016-12-14 60 views
0

我試圖解決歐拉項目的問題3,發現here.我想通過使用Eratosthene的篩子生成一個子列表來解決這個問題(找到了here.我完全沒有完成這個問題,但我遇到了一個小問題...通過Eratosthene的篩子生成素數#

下面是我的代碼,我一直在這樣做,但是,當我運行此代碼時,它阻止我的電腦,並輸出一個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

maxSqrt不應該改變,除非maxNum改變。我的印象是,一個數字的平方根是它的因素最高的因素,並且仍然可能是最重要的。 – RaineAndrews

+3

你現在應該開始學習使用調試器了。它會在你的'while'循環中發現錯誤的時間比你在這裏創建你的問題少得多。單步執行代碼可以教你很多更好的編寫代碼的方法。你永遠不會改變'number',所以它總是保持爲<

+0

那麼,while循環實際上並不會改變它的值,因爲在數字大於maxSqrt之前數字不會改變? – RaineAndrews

回答

1

爲了您的眼前問題,while更改爲if

但是,您的代碼也有其他問題。

  • numberedList距離2〜maxNum整數,你用填充for循環的列表。然後你遍歷整個列表。相反,只需使用for循環中的計數器即可。要保留哪些數字是素數的記錄,BitArray(Int32, Boolean)的效果很好。
  • 這也可以擺脫昂貴的LINQ擴展。當你找到一個非素數時,只需在BitArray中改變它的索引即可。當你找到一個素數時,將它添加到列表中;
+0

是的,以前的評論指出,大好時光!我一直在修補它,但正如你所說,它有嚴重的問題。我必須閱讀BitArray,但這看起來像是一個遊戲改變者。謝謝! – RaineAndrews