【问题标题】:Check Prime Extension检查 Prime 扩展
【发布时间】:2016-07-25 09:03:31
【问题描述】:

这个方法应该检查一个数字是否是素数

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

【问题讨论】:

  • 不是AsParallel 的好候选,因为操作value % x != 0 并不耗时。
  • 效率:该值不需要与2以外的其他偶数进行检查。所以你可以忽略对4,6,8,10,...的检查
  • 那么,赏金的原因是什么?

标签: c# primes


【解决方案1】:

忽略这不是与 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()

【讨论】:

    【解决方案2】:

    反转条件:

    return !Enumerable.Range(2, boundary - 1).AsParallel().Any(x => value % x == 0);
    

    【讨论】:

      【解决方案3】:

      您可以尝试以下更有效的代码:

        var primes = Enumerable.Range(1, 20)
          .Where(i => i != 1 && !Enumerable.Range(2, i - 2).Any(j => i % j == 0));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-15
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多