2011-12-20 139 views
1

我創建了一個簡單的程序來計算素數如下:爲什麼LINQ沒有像預期的那樣工作?

 var db = new HighScoreEntities(); 
     List<Int64> primes = new List<Int64>(){1}; 
     for (Int64 x = 2; x < Int64.MaxValue; x++) 
     { 
      if (primes.FirstOrDefault(y=> x%y == 0) == 0){ 
       primes.Add(x); 
       db.Primes.AddObject(Prime.CreatePrime(x)); 
       db.SaveChanges(); 
      } 
     } 

我的問題是,y是走出來與225上首先通過什麼似乎像後來的隨機數。爲什麼它不通過「素數」列表進行迭代?我也嘗試使用Exists函數獲得相同的結果。

+1

難道這不僅僅是尋找不能被素數整除的數字,而不是那些不能被任何數字整除的數字嗎? – Reddog 2011-12-20 20:49:01

+0

首先,如果x = 2,那麼你的公式是2%y == 0,據我所知,這不是你如何計算素數。此外,Prime.CreatePrime()內部會發生什麼? – 2011-12-20 20:50:51

+1

@Reddog - 這實際上是一種有效的方法。通過綜合數字檢查可分性將是多餘的,因爲任何組合數都可以被分解爲素數。 – 2011-12-20 20:51:40

回答

5

1不是素數,所以將其添加到primes可能是一個不好的開始。它看起來像在每個循環迭代中找到primes中的第一個元素,使得x/1的其餘部分爲0,這將始終爲真。

我沒有自己試試這個程序,所以我可能是錯的,但那應該是一個很好的開始。

+0

這個想法是在2開始添加到數據庫,它是爲了簡化事情,這是一個好點,但它並沒有向我解釋爲什麼y在這樣一個奇怪的數字上進行調試 – 2011-12-20 20:52:23

+0

@Jeff - 我也不確定,但是我肯定會開始在'{2}'和'x'處初始化'primes'在'3'。 – 2011-12-20 20:53:30

+2

@ JeffLauder-您發佈的代碼與您使用的代碼完全相同嗎?因爲沒有辦法'y'取得值225.我運行你的代碼(雖然刪除了與數據庫相關的部分),它從來沒有給我這樣的價值,'y'總是隻有1. – Pako 2011-12-20 20:57:20

2

我用這段代碼看到的第一個問題是primes列表是用1初始化的。這個數字有兩個問題--1不是素數,1總是滿足FirstOrDefault lambda中的要求,因爲任何數模結果會給0。

除此之外,一切似乎相當確定。

3

我想你想的。任何運營商

if (!primes.Any(y=> x%y == 0)) 

還有一些使用LINQ和PLINQ計算素數的例子很多。 Here's just one.

+0

是的,對於這個特定的實現,Any()似乎是要走的路。 – 2011-12-20 21:01:02

+0

'任何'對我來說似乎都比較自然,然而'FirstOrDefault'在這裏也會做得很好。如果有任何號碼會議提出要求,FirstOrDefault將返回這個數字(它將不同於0),如果不是,它將返回0作爲「int」的默認值。但是你是對的 - 「任何」都可以提高代碼的可讀性。 – Pako 2011-12-20 21:01:52

相關問題