在c#中查找素数

时间:2011-06-06 00:16:04

标签: c# .net

在我开始询问之前,我会说出我做了什么。 有一个问题,problem 3,您可以转到该链接,看看它需要什么。 为了解决它,我刚写了一个函数来查找该数字是否为素数。简单。

但是,问题10要求所有素数的总和低于200万(2000000),我通过简单地检查所有数字直到2m来解决这个问题,然后查看它的素数然后将它添加到某个变量。(如果它的素数)

然而,这样做需要花费很多时间。而且这么多时间我的意思是小时。很多小时。所以我不认为我的回答是正确的:)

我在问这里之前搜索了这个问题,但是我找不到c#。我能找到的最接近的是java和fortran,我似乎无法实现算法。

我在这里,问这个。你怎么能这样做?检查每个数字直到2米并注意它是否它的素数不是快速的方式。(这个问题应该在1分钟内计算(问题我的意思是,不是你大声笑)afaik)

感谢。

3 个答案:

答案 0 :(得分:9)

您可以(应该)使用筛子,而不是单独检查每个数字的素数。

也许你甚至可以算出筛子立即移除的所有数字的总和......

隐藏在下面的直截了当的解决方案:

  

http://ideone.com/55j4F

稍微相当快的版本(感谢@Vimvq1987):

  

http://ideone.com/bxq2h

相关的.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倍:)。