此方法应检查数字是否为素数
public static bool IsPrime(this long value)
{
if (value < 2)
{
return false;
}
else
{
int boundary = (int)Math.Floor(Math.Sqrt(value));
return Enumerable.Range(2, boundary-1).AsParallel().Any(x => value % x != 0);
}
}
但并非在每种情况下都有效。例如。 9
是根据此方法的素数但是3x3=9
所以这是错误的。我没有看到方法中的错误。
答案 0 :(得分:3)
忽略这不适用于AsParallel()的事实,你的问题是
return Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x != 0);
应该是
return Enumerable.Range(2, boundary - 1).AsParallel().All(x => value % x != 0);
您应该使用.All()
,而不是.Any()
。
答案 1 :(得分:2)
扭转条件:
return !Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x == 0);
答案 2 :(得分:0)
您可以尝试下面更有效的代码:
var primes = Enumerable.Range(1, 20)
.Where(i => i != 1 && !Enumerable.Range(2, i - 2).Any(j => i % j == 0));