检查Prime扩展

时间:2016-07-25 09:03:32

标签: c# primes

此方法应检查数字是否为素数

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所以这是错误的。我没有看到方法中的错误。

3 个答案:

答案 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));
相关问题