但是,问题10要求所有素数的总和低于200万(2000000),我通过简单地检查所有数字直到2m来解决这个问题,然后查看它的素数然后将它添加到某个变量。(如果它的素数)
然而,这样做需要花费很多时间。而且这么多时间我的意思是小时。很多小时。所以我不认为我的回答是正确的:)
我在问这里之前搜索了这个问题,但是我找不到c#。我能找到的最接近的是java和fortran,我似乎无法实现算法。
我在这里,问这个。你怎么能这样做?检查每个数字直到2米并注意它是否它的素数不是快速的方式。(这个问题应该在1分钟内计算(问题我的意思是,不是你大声笑)afaik)
感谢。
答案 0 :(得分:9)
您可以(应该)使用筛子,而不是单独检查每个数字的素数。
也许你甚至可以算出筛子立即移除的所有数字的总和......
隐藏在下面的直截了当的解决方案:
稍微相当快的版本(感谢@Vimvq1987):
相关的.NET 4.0错误,我相信:https://connect.microsoft.com/VisualStudio/feedback/details/674232/jit-optimizer-error-when-loop-controlling-variable-approaches-int-maxvalue
答案 1 :(得分:3)
有关“快速”素数搜索算法的详细信息,请参阅Sieve of Eratosthenes。维基百科条目甚至指向a C# implementation。另一种选择可能是研究素数之和的任何数学性质。
答案 2 :(得分:2)
Ben Voigt的略微修改版本:
public static void FirstPrime(int limit)
{
Stopwatch sw = new Stopwatch();
sw.Start();
bool[] composite = new bool[limit];
long sum = 0;
int count = 0;
for (int i = 3; i < limit; i++)
{
if (i % 2 == 1)
{
if (!composite[i])
{
++count;
sum += i;
for (int j = i; j < limit; j += 2 * i)
composite[j] = true;
}
}
}
count++;
sum += 2;
Console.WriteLine("There are " + count + " prime numbers less than " + limit + " totalling " + sum);
sw.Stop();
Console.WriteLine("Time elapsed: {0}",sw.Elapsed);
Console.ReadKey();
}
使用Limit = 20,000,000进行测试时,原始版本的成本为1,23s,此版本的成本为0,7259s
使用Limit = 50,000,000进行测试时,原始版本为3,34秒,此版本为1,988秒
一般来说,这个版本大约快1.6倍:)。