繁体   English   中英

使用LINQ的C#Prime数字

[英]C# Prime Numbers with LINQ

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

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();

    }

目前,此代码不正确会遗漏小于sqrt(n)的素数。 该代码应该得到2到100之间的素数。相反,它只打印素数11及以上。 素数2, 3, 5, 7丢失。

你有一个逻辑问题。 一切都可以均匀分配,所以你应该检查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))
            );

除数的约束是不正确的 - 当你只需要检查2和Sqrt(value)之间的除数时,你正在看2和Sqrt(ep) (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的答案也以不同的方式解决了同样的问题。 您的代码仍将检查不必要的除数。

最佳方案:

            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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM