这些天我对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)
缺失。
答案 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。