【发布时间】:2018-12-29 15:42:33
【问题描述】:
我正在尝试“找到第 10001 个素数”作为 Project Euler 挑战的一部分,但我不知道为什么我的代码不起作用。当我测试我的 isPrime() 函数时,它成功地找到了一个数字是否是素数,但我的程序返回 10200 作为第 10001 个素数。这是为什么呢?
这是我的代码:
using System;
using System.Collections.Generic;
namespace Challenge_7
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Solution to Project Euler");
Console.WriteLine("Challenge 7 - Find the 10001st prime");
Console.WriteLine("\nProject Start:");
List<int> primes = new List<int>();
int number = 1;
while (primes.Count != 10001)
{
if (isPrime(number))
{
primes.Add(number);
Console.WriteLine(number);
}
number++;
}
Console.WriteLine("The 10001st prime is: {0}", primes[10000]);
Console.ReadLine();
}
private static bool isPrime(int n)
{
bool prime = true;
for (int i = 1; i <= Math.Ceiling(Math.Sqrt(n)); i++)
{
for (int j = 1; j <= Math.Ceiling(Math.Sqrt(n)); j++)
{
if (i * j == n)
{
prime = false;
}
}
}
return prime;
}
}
}
【问题讨论】:
-
所以如果你调用 isPrime(10200) 你是真的吗?
-
正如彼得在答案中提到的,您的方法不正确。有很多方法可以检查 SOF 上的数字是否为素数。我建议你学习并尝试这个:stackoverflow.com/a/15743238/4329813
-
您使用
Math.Sqrt()的方法应仅适用于检查i * j == n的一个号码,而不适用于两个值。 -
Sqrt(10200) is 100.995和10200 = 2 * 5100但您的for loop永远不会到达5100以检查2 * 5100!