带LINQ的C#素数

带LINQ的C#素数,c#,linq,lambda,primes,C#,Linq,Lambda,Primes,这些天我对LINQ很感兴趣。我想得到素数。我实际上做得很好,但是我的代码没有显示低于Sqrt(n)的素数 static void Main(字符串[]args) { 可枚举函数= (起点、终点)=> 可枚举的.Range(Math.Min(起点,终点),Math.Abs(起点-终点)+1); Func是完全分开的= (值、除数)=> (值%除数)。等于(0); int sp=2, ep=100; 变量查询= 可枚举范围(sp、ep) .其中(值=> EnumerableRange(2,(整数)数

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

static void Main(字符串[]args)
{
可枚举函数=
(起点、终点)=>
可枚举的.Range(Math.Min(起点,终点),Math.Abs(起点-终点)+1);
Func是完全分开的=
(值、除数)=>
(值%除数)。等于(0);
int sp=2,
ep=100;
变量查询=
可枚举范围(sp、ep)
.其中(值=>
EnumerableRange(2,(整数)数学上限(数学Sqrt(ep)))
.Any(除数=>
isFullyDivided(值、除数))
);
var素数=
可枚举范围(sp、ep)
。除(查询)外;
foreach(素数形式的变量项)
{
安慰
.WriteLine(项目);
}
安慰
.Read();
}

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

您有一个逻辑问题。所有东西都可以自己平均分配,因此您应该检查
值!=除数
。否则,您将不正确地排除自行除法的数字(例如
5%5==0


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

这就是为什么你的素数从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.天花。

你能更具体地说明你的代码是如何工作的吗?下面的代码给出了素数11及以上。11以下的2、3、5、7缺失。谢谢。真的谢谢。我在想“我错过了什么?该死。”真的很感激。@ryanyyu的回答是正确的。我错过了那种情况!value.Equals(除数)如果您更改除数选择,则不需要该条件。True-您仍然需要使用您的方法的条件,但我仍然主张您可以缩小除数的范围。一旦你检查了
Sqrt(value)
大多数素数生成器显式地添加2和3,然后从2循环到
Floor(Sqrt(n))
也谢谢你使用Sqrt(value),它会更快。这是一个很好的改进,可以减少需要的比较数量。
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))
            );
    var query =
        EnumerableRange(sp, ep)
        .Where(value =>                                      V----------
            EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(value)))
            .Any(divisor =>
                isFullyDivided(value, divisor))
                );
            var query =
            EnumerableRange(sp, ep)
            .Where(value =>
                EnumerableRange(2, (int)Math.Ceiling(Math.Sqrt(value)))
                .Any(divisor =>
                    !value.Equals(divisor) &&
                    isFullyDivided(value, divisor))
                    );