Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中查找素数#_C#_.net - Fatal编程技术网

C# 在c中查找素数#

C# 在c中查找素数#,c#,.net,C#,.net,在我开始问之前,我会告诉你我做了什么。 出现了一个问题,您可以转到该链接并查看它需要什么。 为了解决这个问题,我只写了一个函数来确定这个数是否为素数。简单 但是,问题10要求所有素数之和小于200万(2000000),我解决这个问题的方法是简单地检查所有数直到2m,看看它的素数是否为,然后将它添加到某个变量中 然而,这样做需要很多时间。有这么多时间,我是说几个小时。很多小时。所以我认为我的答案不对:) 在问这个问题之前,我在谷歌上搜索了一下,但没有找到c。我能找到的最接近的是java和fortr

在我开始问之前,我会告诉你我做了什么。 出现了一个问题,您可以转到该链接并查看它需要什么。 为了解决这个问题,我只写了一个函数来确定这个数是否为素数。简单

但是,问题10要求所有素数之和小于200万(2000000),我解决这个问题的方法是简单地检查所有数直到2m,看看它的素数是否为,然后将它添加到某个变量中

然而,这样做需要很多时间。有这么多时间,我是说几个小时。很多小时。所以我认为我的答案不对:)

在问这个问题之前,我在谷歌上搜索了一下,但没有找到c。我能找到的最接近的是java和fortran,我似乎无法实现算法

我来了,问这个。你怎么能这么做?检查每一个数字直到2米,注意它的素数是否不是快的方式。(同样,这个问题应该在1分钟内计算(我指的是问题,不是你lol)好的)


谢谢。

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

也许你甚至可以算出一次筛下的所有数字的总和

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

稍微快一点的版本(由于):


还有一个相关的.NET 4.0错误,我相信:

有关“快速”素数搜索算法的详细信息,请参阅。维基百科的条目甚至指向。另一种选择可能是研究素数和的任何数学性质。

本·沃伊特的稍加修改版本:

    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();
    }
公共静态void FirstPrime(整数限制)
{
秒表sw=新秒表();
sw.Start();
bool[]复合=新bool[限制];
长和=0;
整数计数=0;
对于(int i=3;i
当极限测试=20000000时,原始版本成本为1,23s,而此版本成本为07259s

当极限测试=50000000时,原始版本成本为3,34秒,此版本成本为1988秒


通常,此版本的速度约为1.6倍:)

欢迎使用堆栈溢出,请通读。您没有发布任何代码,因此无法知道您的代码能力级别。此外,它将帮助我们从哪里开始改进您的算法。我能想到的一个窍门是不要检查每个数字。一旦你检查了一个数字,你就不需要检查倍数了。一半的数字
<2000000
是2的倍数。我认为这可能是最好的选择。已经有一段时间了,但我记得Eratosthenes()的seve实现起来相当简单。可能会有更有效的方法,但在易实现性和效率之间需要权衡。@Thomas:这是我的意图。事实上,我刚刚实现了Eratosthenes的筛选,它在ideone上运行50毫秒。如果你这么关心效率,使用I+=2而不是I++并跳过“If((I%2)==1)”检查不是更好吗?很好的捕获:,运行时缩短了8%:)我不知道你从哪里得到这些数字,但是50000000次迭代只需要0.1秒:跳过奇数只节省了一点点:我在我的机器上做了基准测试,Limit=50000000,而不是5000000:)@Vimvq1987我刚刚记得你也可以将循环定义为
for(int j=I*I;j
因为i和i*i之间的任何组合都必须有一个已处理的素数作为其因子之一,所以它已经被标记。