【问题标题】:Optimising code to find the lowest number divisible by all integers between 1-20优化代码以找到可被 1-20 之间的所有整数整除的最小数
【发布时间】:2015-01-23 03:22:18
【问题描述】:

我目前正在尝试解决问题“可以被 1 到 20 的所有数字整除的最小正数是多少?”

到目前为止,我编写的代码似乎可行,但需要很长时间。此外,我不得不在 if 中使用大量的“和”语句,这看起来既不高效也不专业。

我可以做些什么来优化这段代码并让它更整洁?

number = 1
result = 0

def divide(candidate):
    if candidate % 2 == 0 and candidate % 3 == 0 and candidate % 4 == 0 and candidate % 5 == 0 and candidate % 6 == 0 and candidate % 7 == 0 and candidate % 8 == 0 and candidate % 9 == 0 and candidate % 10 == 0 and candidate % 11 == 0 and candidate % 12 == 0 and candidate % 13 == 0 and candidate % 14 == 0 and candidate % 15 == 0 and candidate % 16 == 0 and candidate % 17 == 0 and candidate % 18 == 0 and candidate % 19 == 0 and candidate % 20 == 0:
        global result
        result = 1
        return 1

    else:
       global number
        result = 0
        number = number + 1
        return 0

while result == 0:
divide(number)

print "The lowest number divisible by all integers between 1-20 is:", number

澄清一下,这不是家庭作业,我正在自学 Python,并且正在尝试一些 ProjectEuler 问题作为其中的一部分。

【问题讨论】:

  • 这是作业吗?一个提示:你真的需要检查 1 到 20 之间的所有数字的可分性吗?如果一个数可以被 2 和 3 整除,那么它还能被 1 到 20 之间的哪些数整除?
  • 这不是功课,我只是在我的学术之外自学python。好点,谢谢!
  • 您可能有兴趣在谷歌上搜索“最小公倍数”。
  • 您的算法有误。有关 C 中的解决方案,请参阅 stackoverflow.com/questions/8416395/…

标签: python math divide


【解决方案1】:

您的问题可以在没有计算机帮助的情况下轻松解决,因此优化版本会简单地打印答案。很难说您认为可以接受多少优化。

以下是在没有计算机的情况下解决此问题的方法。能被 1 到 20 的所有数整除的最小数必须能被这些数中出现的所有素数整除。另一方面,如果我们有一个数可以被这个范围内的所有素数整除,那么它将可以被从 1 到 20 的所有数整除。由于具有不同基数的素数是互质的,因此所有最高素数的乘积这个范围内的每个素数都是答案。所以这是优化后的代码:

print 2**4 * 3**2 * 5 * 7 * 11 * 13 * 17 * 19

【讨论】:

  • 哇,真的是优化了!我不太明白的一件事是当你说“每个素数的最高素数”时:/
  • @c3ntury:读作“对于 1 到 20 范围内的每个素数,取这个范围内出现的这个素数的最高幂。”
  • 啊,所以你有 24,因为它等于 16 和 32,因为它等于 9?你为什么不把 16 和 9 放在一起呢? :s
  • @c3ntury:起初我什至是 di,但后来我认为这样可能更清楚。显然我错了。 :)
  • “这个范围内每个素数的所有最高素数的乘积将是答案” - 提及 如何 查找会很有帮助指数(“主要幂”)。如果 p 是我们的质数(例如 2),n 是我们的最大值(例如 20),那么指数就是 floor(log_p(n))。素数本身可以通过筛分找到。
【解决方案2】:

您可以从消除作为先前数字的因子的数字开始。所有能被 4 整除的数字都能被 2 整除。所有能被 10 整除的数字都能被 5 整除,所有能被 9 整除的数字都能被 3 整除,等等。

【讨论】:

  • 谢谢,我会尽快更改我的代码以反映这一点。有没有什么办法可以在没有 15 个左右的情况下做到这一点?并且在 if 内?
  • @c3ntury - 将所有数字放在一个列表中,然后遍历列表并测试每个数字。
【解决方案3】:

如果是我,我会尝试“修改”(%) 素数。我不会使用从 1 到 20 的每个数字。

【讨论】:

    【解决方案4】:

    一个非常简单但非常有效的方法是仅使用质数及其幂。为什么你必须考虑他们的乘数,对吧?将您的“和”条件减少到只有 4,9,16,5,7,11,13,17,19

    【讨论】:

    • 小心:能被 2 整除并不意味着能被 4、8 或 16 整除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多