如何加快 Amicable 数字算法的速度?

2024-02-10

完成 100,000 的 limit(n) 需要相当长的时间。

我怀疑问题出在计算友好()数字越大,计算时间就越长。我可以改变什么来使其速度比这更快?

public static void Main (string[] args)
    {
        CheckAmicable (1, 100000);

    }

    public static int CheckAmicable(int start, int end)
    {
        for (int i = start; i < end; i++) {

            int main = CalculateAmicable (i); //220
            int temp = CalculateAmicable (main); //284
            int compare = CalculateAmicable (temp); //220
            if (compare == main) {
                if (main != temp && temp == i) {
                    Console.WriteLine (main + " = " + temp + " = " + compare + " i: " + i);
                    i = compare + 1;
                }
            }
        }
        return 0;
    }

    public static int CalculateAmicable(int number)
    {
        int total = 0;
        for (int i = 1; i < number; i++) {
            if (number%i == 0){
                total += i;
            }
        }
        return total;
    }

注意:英语不是我的母语!


Yes, CalculateAmicable is 效率低下 - O(N)复杂性 - 所以你必须N tests 1e5 * 1e5 == 1e10 - 操作速度很慢。 该方案将复杂度降低到O(log(N)) is

  int n = 100000;

  //TODO: implement IList<int> GetPrimesUpTo(int) yourself
  var primes = GetPrimesUpTo((int)(Math.Sqrt(n + 1) + 1));

  // Key - number itself, Value - divisors' sum 
  var direct = Enumerable
    .Range(1, n)
    .AsParallel()
    .ToDictionary(index => index, 
                  index => GetDivisorsSum(index, primes) - index);

  var result = Enumerable
    .Range(1, n)
    .Where(x => x < direct[x] && 
                direct.ContainsKey((int) direct[x]) &&
                direct[(int) direct[x]] == x)
    .Select(x => $"{x,5}, {direct[x],5}");

  Console.Write(string.Join(Environment.NewLine, result));

结果在一秒钟内(Core i7 3.2Ghz .Net 4.6 IA-64):

  220,   284
 1184,  1210
 2620,  2924
 5020,  5564
 6232,  6368
10744, 10856
12285, 14595
17296, 18416
63020, 76084
66928, 66992
67095, 71145
69615, 87633
79750, 88730

Details GetDivisorsSum:

private static long GetDivisorsSum(long value, IList<int> primes) {
  HashSet<long> hs = new HashSet<long>();

  IList<long> divisors = GetPrimeDivisors(value, primes);

  ulong n = (ulong) 1;
  n = n << divisors.Count;

  long result = 1;

  for (ulong i = 1; i < n; ++i) {
    ulong v = i;
    long p = 1;

    for (int j = 0; j < divisors.Count; ++j) {
      if ((v % 2) != 0)
        p *= divisors[j];

      v = v / 2;
    }

    if (hs.Contains(p))
      continue;

    result += p;

    hs.Add(p);
  }

  return result;
}

And GetPrimeDivisors:

private static IList<long> GetPrimeDivisors(long value, IList<int> primes) {
  List<long> results = new List<long>();

  int v = 0;
  long threshould = (long) (Math.Sqrt(value) + 1);

  for (int i = 0; i < primes.Count; ++i) {
    v = primes[i];

    if (v > threshould)
      break;

    if ((value % v) != 0)
      continue;

    while ((value % v) == 0) {
      value = value / v;

      results.Add(v);
    }

    threshould = (long) (Math.Sqrt(value) + 1);
  }

  if (value > 1)
    results.Add(value);

  return results;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何加快 Amicable 数字算法的速度? 的相关文章

  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • Android-如何在文本视图上显示文本选择?

    我正在实现一个 epub 阅读应用程序 其中使用 textview 来显示 epub 文本 我想当用户长按文本视图时从文本视图中选择文本 然后对文本视图的选定文本执行多种操作 例如突出显示等 那么 我如何向用户显示这些光标来选择用户想要的文
  • 天文台重置

    我正在尝试完全重新启动 Chronometer 但它不起作用 相反 它正在暂停 基本上我想做的是在计时器计数到 10 时做一些事情 完成后我们提示用户重试 在这种情况下 我们希望从 1 秒重新计数到 10 秒 但计时器从暂停时间开始 而不是
  • Emscripten 绑定:如何从 Javascript 创建可访问的 C/C++ 数组?

    我在用box2d https github com kripken box2d js 并尝试创建一个链条形状 为了创建链形状或多边形形状 我必须传递向量数组才能指定几何形状 我没有看到任何文档可以帮助我完成此任务 也没有看到有关绑定的注释h
  • ASP.NET - Server.HtmlEncode 将哪些字符编码为命名字符实体

    Server HtmlEncode 将哪些字符编码为命名字符实体 到目前为止我只发现 lt gt amp and quot 肯定还有更多的事情吗 这是代码HtmlEncode 所以在这里您可以看到他们是如何做到的 public static
  • C“for”循环中的多个条件

    我遇到了这段代码 我通常使用 或 将多个条件分开for循环 但此代码使用逗号来执行此操作 令人惊讶的是 如果我改变条件的顺序 输出就会改变 include
  • freemarker跳过assertNotNull InvalidReferenceException

    我使用 freemarker 渲染对象列表 ul lt list publication as item gt li b item key b item value li ul 但有些项目的 item value null 会引发异常 fr
  • Runbook 测试窗格不显示写入输出

    我对自动化是全新的 对 Powershell 也很陌生 所以我希望这是一个简单的修复 我正在尝试让一些代码运行 据我所知 它确实运行了 但测试窗格没有显示任何内容 基于此线程 Azure powershell Runbook 不显示任何输出
  • 从 ionic 应用程序调用本机 Android 应用程序

    我正在开发一个将由 Android 本机应用程序调用的应用程序 我还得给他们打电话 为此我发现这个插件 https github com EddyVerbruggen Custom URL scheme 他们将按照以下代码调用我的应用程序
  • 如何实现 dropzone.js 将文件上传到 Amazon s3 服务器?

    请帮助实现 dropzone js 将文件上传到 Amazon s3 服务器 已经参考了以下链接https github com enyo dropzone issues 33 https github com enyo dropzone
  • 如何在Android上从方位角获取罗盘方向

    我必须显示用户指向 Android 设备的方向 我在用Sensor TYPE ACCELEROMETER Sensor TYPE MAGNETIC FIELD获取方位角 俯仰角 横滚角 但我能够弄清楚如何从中获取方向 北 南 东 西 请帮忙
  • eclipse使用什么算法在Serialized类中生成verison id?

    假设这是我的班级 class B implements Serializable private static final long serialVersionUID 5186261241138469827L what algo is us
  • 如何在Java中独立于主线程运行线程?

    目标是能够调用执行单独的线程从内部主班 一些背景 我有一个程序必须运行process 过程 一个cmd 仅当主程序执行完毕并从内存中卸载时才应运行 我应该在其中包含什么代码主班 如果你的意思是 我如何启动一个不会在我的 JVM java 程
  • Google 在 iOS 上设置自动完成功能 - 无法加载搜索结果 - 请重试

    我在这里发布这个是因为我不知道还能在哪里发布这个 今天 我们的应用程序不再返回 Google Places API 的结果 我们看到该请求在 Google 开发者控制台上得到通过 但所有手机均未返回任何结果 今天这个数字还在攀升 并且每个用
  • 比较两个指针是否相等的二叉搜索树遍历

    我正在阅读 Cormen 算法书 二叉搜索树章节 它说有两种无需递归即可遍历树的方法 使用堆栈和 更复杂但更优雅 不使用堆栈的解决方案 但 假设两个指针可以 测试平等 我已经实现了第一个选项 使用堆栈 但不知道如何实现后者 这不是作业 只是
  • Ruby 流 tar/gz

    基本上我想将内存中的数据流式传输为 tar gz 格式 可能将多个文件传输到 tar 中 但它永远不应该接触硬盘 只能流式传输 然后将它们流式传输到其他地方 在我的例子中是 HTTP 请求体 有人知道现有的图书馆可以做到这一点吗 Rails
  • 如何清理 if else 系列

    在C 中工作 想要减少if else系列 实体有两个属性FromServiceID and ToServiceID 假设我的ServiceClass实例有以下信息 如何清理以下代码 任何类型的建议都可以接受 entity new Servi
  • 使用 PHP GD 合并两个图像 (.JPG)

    我找不到解决方案 我想给这张图片添加 20px 的空白 http img233 imageshack us img233 419 78317401 jpg http img233 imageshack us img233 419 78317
  • 如何在 python 中使用列表理解来展平多个列表

    我目前有多个由内部列表组成的列表 我已经找到了如何使用列表理解来展平列表 但是如何在不重复使用同一行代码的情况下做到这一点 这是一个示例代码 first 1 2 3 4 5 6 7 8 9 second 3 5 6 0 3 4 third
  • WTSSendMessage 不在远程桌面上显示消息框

    我有一个 Windows 服务应用程序 它显示确认弹出窗口以进行进一步操作 当我在本地计算机上安装服务应用程序时 它工作正常 但当我将其安装在远程计算机上时 不会显示确认弹出窗口 DllImport Kernel32 dll SetLast
  • 如何加快 Amicable 数字算法的速度?

    完成 100 000 的 limit n 需要相当长的时间 我怀疑问题出在计算友好 数字越大 计算时间就越长 我可以改变什么来使其速度比这更快 public static void Main string args CheckAmicabl