2011-12-20 93 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

相关问题