使用LINQ的C#Prime数字

时间:2015-07-29 15:37:39

标签: c# linq lambda primes

这些天我对LINQ很感兴趣。我想获得素数。我实际上做得很好,但我的代码没有显示低于Sqrt(n)的素数。

undefined method `authenticate' for nil:NilClass

目前,此代码不正确会遗漏小于static void Main(string[] args) { Func<int, int, IEnumerable<int>> EnumerableRange = (startPoint, endPoint) => Enumerable.Range(Math.Min(startPoint, endPoint), Math.Abs(startPoint - endPoint) + 1); Func<int, int, bool> isFullyDivided = (value, divisor) => (value % divisor).Equals(0); int sp = 2, ep = 100; var query = EnumerableRange(sp, ep) .Where(value => EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(ep))) .Any(divisor => isFullyDivided(value, divisor)) ); var primeNumbers = EnumerableRange(sp, ep) .Except(query); foreach (var item in primeNumbers) { Console .WriteLine(item); } Console .Read(); } 的素数。该代码应该得到2到100之间的素数。相反,它只打印素数11及以上。素数sqrt(n)缺失。

3 个答案:

答案 0 :(得分:2)

你有一个逻辑问题。一切都可以均匀分配,所以你应该检查value != divisor。否则,您将错误地排除自我划分的数字(例如5 % 5 == 0)。

var query =
    EnumerableRange(sp, ep)
    .Where(value =>
        EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(ep)))
        .Any(divisor =>
             value != divisor &&  //This is the logic you are missing
             isFullyDivided(value, divisor))
            );

答案 1 :(得分:1)

你的除数约束是不正确的 - 当你只需要检查2和Sqrt(ep)之间的除数时,你正在看2和Sqrt(value)之间的除数(10):

    var query =
        EnumerableRange(sp, ep)
        .Where(value =>                                      V----------
            EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(value)))
            .Any(divisor =>
                isFullyDivided(value, divisor))
                );

这就是为什么你的素数从11开始,因为你的除数达到10,其中包括价值本身。 @ ryanyuyu的回答也以不同的方式解决了同样的问题。您的代码仍将检查不必要的除数。

答案 2 :(得分:0)

最佳解决方案:

            var query =
            EnumerableRange(sp, ep)
            .Where(value =>
                EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(value)))
                .Any(divisor =>
                    !value.Equals(divisor) &&
                    isFullyDivided(value, divisor))
                    );

Math.Floor错了。正确的是Math.Ceiling。