带LINQ的C#素数
这些天我对LINQ很感兴趣。我想得到素数。我实际上做得很好,但是我的代码没有显示低于Sqrt(n)的素数带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,(整数)数
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))
);