【问题标题】:Is there a more efficient way other than brute force for Project Euler #5?对于 Project Euler #5,除了蛮力之外,还有更有效的方法吗?
【发布时间】:2020-09-20 01:36:35
【问题描述】:

我正在经历 euler 项目,和很多人一样,我被困在效率上。我不介意尝试将时间从 7 毫秒减少到 6 毫秒,但我确实关心我的循环必须等待半小时。 问题是:

能被 1 到 20 的所有数整除的最小正数是多少?

我认为我在 python 中有一个有效的解决方案,但它的效率非常低。

import sys
import math

def multiple():
    multiple = 20
    multiples = []
    while multiple < math.sqrt(sys.maxsize):
        div_flag = False
        max_flag = False
        for i in range(2, 21):
            if multiple % i == 0:
                div_flag = True
                if i == 20:
                    max_flag = True
                else:
                    max_flag = False
            if multiple % i != 0:
                div_flag = False
                break
        if max_flag == True:
            multiples.append(multiple)
            multiple = math.sqrt(sys.maxsize)
        multiple += 20
        print(multiple, "div_flag: " + str(div_flag), "max_flag: " + str(max_flag), str(multiples)) 
    # These prints are just there for debugging.
    print(multiples)



multiple()

如您所见,它遍历每个数字,直到最大安全整数的 sqrt()。 sqrt() 的原因是因为我试图让它更有效率,但无论如何它从来没有达到那一点。我让它运行了大约 15 分钟,它达到了大约 200 万(这是当变量 multiples 为 2 并增加 1 时)。然后,我尝试将multiple 变量增加 20(如上所示),在 15 分钟多一点的时间里,我有 4500 万。我在做欧拉项目的时候看了一下答案,大概是2亿左右。我没有作弊,我只是确保我的程序有问题并且它没有跳过那个目标数字。是什么让我可以在一分钟内得到答案,我说。正如我所说,我不是效率狂,我只想在一分钟内看到结果。

我对 python 还很陌生,所以我知道有一些非常明显的答案。

附: 我不希望直接重写我的代码,所以也许这里和那里的一些示例代码,一些提示会很好。(所以我实际上学习并改进了我的编码。) p>

【问题讨论】:

  • 在实践中,您只需对每个数进行质数分解,并保持每个质数的最大指数

标签: python algorithm performance math


【解决方案1】:

我对 Euler 项目并不熟悉,但这个问题并不是真正的编程问题,而是数学问题。答案就是 2^4 * 3^2 * 5 * 7 * 11 * 13 * 17 * 19。

如果您尝试查看从 1 开始的每个数字,直到找到符合标准的数字,那么您解决的问题是错误的。

您的目标是计算lcm(1, 2, 3, 4, .... 20),即least common multiple。在 stackoverflow 上的一些搜索将向您展示如何计算数字列表的 lcm。有趣的是,math.lcm 将被添加到 Python 3.9。

【讨论】:

  • 2^4 是 2 的最大幂,即 ≤ 20。3^2 是 3 的最大幂。同样,5^1, 7^1, ... 对于每个素数20. 对于更一般的问题,lcm(a, b, c, d, ...) 被定义为能被 a, b, c, d, ... 整除的最小数,这正是你的意思寻找。 StackOverflow 有大量关于如何在 Python 中计算的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 2010-10-05
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多