使用筛子后素数求和仍然很慢

2023-12-04

我尝试了下面的项目欧拉编码挑战,代码给出的答案是正确的,但我不明白为什么它需要近一分钟才能运行。在使用筛子之前,它的完成时间相似。其他用户报告的时间低至毫秒。

我认为我在某个地方犯了一个基本错误......

   // The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
   // Find the sum of all the primes below two million.
   public static long Ex010()
   {
      var sum = 0L;
      var sieve = new bool[2000000];
      var primes = new List<int>(10000);

      for (int i = 2; i < sieve.Length; i++)
      {
         if (sieve[i-1])
            continue;

         var isPrime = true;
         foreach (var prime in primes)
         {
            if (i % prime == 0) {
               isPrime = false;
               break;
            }
         }

         if (isPrime) {
            primes.Add(i);
            sum += i;

            for (var x = i * 2; x < sieve.Length; x += i) {
                  sieve[x-1] = true;
            }
         }
      }

      return sum;
   }

EDIT:

唯一似乎缺少的是这个优化:

        if (prime > Math.Sqrt(i))
            break;

它将时间缩短至 160 毫秒。

EDIT 2:

最后点击,按照多次建议取出 foreach。现在是 12 毫秒。最终解决方案:

   public static long Ex010()
   {
      var sum = 0L;
      var sieve = new bool[2000000];

      for (int i = 2; i < sieve.Length; i++)
      {
         if (sieve[i-1])
            continue;

         sum += i;

         for (var x = i * 2; x < sieve.Length; x += i) {
            sieve[x-1] = true;
         }
      }

      return sum;
   }

除了筛子之外,你还进行了试除。
布尔数组已经告诉您一个数字是否是素数,因此您根本不需要素数列表。
您还可以通过仅筛选至极限的平方根来加快速度。
如果你还想节省一些内存,你可以使用BitArray而不是布尔数组。

public static long Ex010()
{
    const int Limit = 2000000;
    int sqrt = (int)Math.Sqrt(Limit);
    var sum = 0L;
    var isComposite = new bool[Limit];

    for (int i = 2; i < sqrt; i++) {
        if (isComposite[i - 2])
            continue;//This number is not prime, skip

        sum += i;

        for (var x = i * i; x < isComposite.Length; x += i) {
            isComposite[x - 2] = true;
        }
    }
    //Add the remaining prime numbers
    for (int i = sqrt; i < Limit; i++) {
        if (!isComposite[i - 2]) {
            sum += i;
        }
    }
    return sum;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用筛子后素数求和仍然很慢 的相关文章

随机推荐

  • 在有限域上插值多项式

    我想在有限域中的点上使用 python 插值多项式 并获得具有该域中系数的多项式 目前我正在尝试使用 SymPy 并专门进行插值 来自sympy polys polyfuncs 但我不知道如何强制插值在特定的 gf 中发生 如果没有 可以用
  • NSXMLParserDelegate 和 iPhone SDK 3.1.X

    我在商店里有一个为 3 1 2 构建的应用程序 但在 4 0GM 下崩溃了 我已经使用 Xcode 3 2 3 修复了崩溃问题 但也收到警告称此类类未实现 NSXMLParserDelegate 我添加到标题中 一切看起来都很好 我现在已经
  • 如何使用 pandas 数据框构建人口金字塔

    如何根据以下起始数据框绘制人口金字塔 Age Gender Count 0 50 45 years male 4 1 50 45 years female 5 2 55 65 years male 6 3 55 65 years femal
  • 在ggplot2中,可以仅更改条形边框的一侧吗? (颜色、厚度)

    我知道 3D 条形图是一种罪过 但我被要求这样做 作为一种权衡 我建议只制作一个比顶部和右侧的栏颜色稍深的边框 这样 条形图就会有某种 阴影 呃 但至少你仍然能够比较它们 有什么办法可以做到这一点吗 ggplot diamonds aes
  • 在代码隐藏中创建数据模板

    如何以编程方式向数据模板添加控件 例如 下面我创建了 TextBlock 和 DataTemplate TextBlock text new TextBlock DataTemplate template new DataTemplate
  • JavaScript Unicode 的长度(星体符号)

    我有一个 lt input type text gt 在 HTML 中 每次我添加一个字符时我都会执行if text length lt x 在 JavaScript 中 问题是 Unicode 特殊字符 星体符号 u 具有超过 4 个十六
  • 如何通过代码关闭 Ionic 5 应用程序?

    我找不到在 Ionic 5 系统中关闭应用程序的方法 看起来 Ionic 4 中的方法不适用于 Ionic 5 可以做吗 closeApp this platform backButton subscribeWithPriority 999
  • 本地修改的按值传递的参数会发生什么情况?

    我很清楚 修改按值传递的函数参数在 C C 函数之外是无效的 但编译器允许这样做 但会发生什么 是该论证的本地副本吗 是可修改的在函数内 include
  • 如何在 Sprite Kit、Objective C 中用手指移动击中物体

    我正在尝试制作一个游戏 其中我有一些 SKSpriteNode 并且用户可以通过手指移动来击中它们 我正在使用苹果的新 Sprite 套件 为此 我尝试了一个技巧 将 Sprite X SKSpriteNode 放置在手指所在的位置 当用户
  • 如何将数据表分成两个单独的列

    我有一个数据表 其中有很多列 只有一行 DataSet myDataSet new DataSet da Fill myDataSet myDataTable new DataTable myDataTable myDataSet Tabl
  • 如何将行动态添加到表格布局中

    我在 sqlite 中有某些数据 每次单击 保存 按钮时它都会更新 并且我想将数据显示到表布局中 以便为更新的数据添加更多行 我有某些代码 但它仅显示更新的数据替换以前的数据 并且我想在数据更新时添加更多行 我知道这只是在表格布局中添加一行
  • 如何从 Databricks 笔记本将文本文件上传到 FTP

    我试图找到解决方案 但一无所获 我是这方面的新手 所以如果您知道解决方案 请帮助我 谢谢 Ok I found a solution copy file from ADLS to SFTP from ftplib import FTP TL
  • 正则表达式替换除斜线之外的所有特殊字符?

    我正在尝试制定一些正则表达式 以消除 SharePoint 在创建文件夹时不会采用的所有特殊字符 这些是不允许的字符 我假设下面的底部正则表达式将处理所有这些字符 但我也想用破折号替换 或 lt gt 这就是我到目前为止所拥有的 但如果可能
  • 什么时候纹理内存应该优先于常量内存?

    如果线程之间的数据请求频率非常高 每个线程从特定列中选取至少一个数据 那么在 Pascal 架构中使用常量内存中的数据存储是否比纹理有任何好处 编辑 这是一个拆分版本这个问题改善社区搜索 如果满足对恒定内存使用的期望 则在一般情况下使用恒定
  • Windows 文件复制内部结构(动态加密)

    我必须为 Windows 编写一个即时加密器来加密所有复制的文件 为了实现这一点 我需要一些有关 Windows 如何进行加密的详细信息FileCopy works 所以我需要如下的描述 CreateFile被调用 创建一个目标文件 然后从
  • 在同一头文件中声明、初始化和使用全局变量

    我实际上正在尝试使用在头文件 例如 x h 中初始化的变量 并希望在同一头文件中的内联代码中使用相同的变量 同一变量在另一个文件 例如 y c 中被修改 我怎样才能做到这一点 我想知道这样做的好方法 使用extern保留字 切勿在 h 文件
  • 我需要简单的 Android 动画示例 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 请给我使用 XML 的简单 Android 动画示例 我是 Android 新手
  • 点击手势在 imageView 中不起作用,但在另一个视图中起作用

    我在图像和视频叠加中工作 因为我放置了一个图像视图 我将tapGestureRecognizer分配给该图像视图 但它不起作用 对于视频 我放置了一个MPMoviePlayerController 并将tapGestureRecognize
  • 资源更改时静态绑定不会更新

    我首先想说我对绑定非常陌生 我已经在 WPF 中做了一些事情 但我从未使用过绑定 因为这个概念对我来说有点难以理解 即使我现在正在做的事情也是我从我不完全理解的教程中设法挽救的 在我的应用程序中 我有一个具有静态属性的静态类 并且有一个更改
  • 使用筛子后素数求和仍然很慢

    我尝试了下面的项目欧拉编码挑战 代码给出的答案是正确的 但我不明白为什么它需要近一分钟才能运行 在使用筛子之前 它的完成时间相似 其他用户报告的时间低至毫秒 我认为我在某个地方犯了一个基本错误 The sum of the primes b