当前位置: 首页 > 知识库问答 >
问题:

在Python中找到一系列数字中最小的等分数,谜题

司徒博容
2023-03-14

我正在尝试解决下面详述的一个projecteuler难题。我当前的函数适用于数字1到10,但当我尝试1到20时,它只会永远循环而没有结果。

2520是可以被1到10的每个数字除的最小数,没有任何余数。可以被1到20的所有数字整除的最小正数是多少?

def calculate():
    results = dict()
    target = 20
    num_to_test = 1
    while len(results) < target:
        for j in range(1, target+1):
            results[num_to_test] = True
            if num_to_test % j != 0:
                # current num_to_test failed in the 1-10, move on
                del results[num_to_test]
                break

        num_to_test += 1
    return min(results)

有人能看到逻辑上的任何问题吗?特别是我想知道为什么它能实现10个目标,而不是20个。谢谢

共有3个答案

陈富
2023-03-14

许多其他答案提到原始代码效率低下,但它们仍然循环遍历几乎每个数字。利用lcm功能不是更有效吗?

def calculate(num, current_lcm = 1):
    if (num == 1): return current_lcm
    return calculate(num - 1, lcm(num, current_lcm))

def lcm(a, b):
    return a * b // gcd(a, b)

def gcd(a, b):
    while b:      
        a, b = b, a % b
    return a

print calculate(20)
燕元明
2023-03-14

实际上,我有非常有效的算法来解决这个问题。我不会给你密码,但我可以给你指路

对于N=10

1、计算从5到10的所有数字的所有因子:

 [[2, 3], [7], [2, 2, 2], [3, 3], [2, 5]]

2.计算列表中每个素数的最大数

 {2: 3, 3: 2, 5: 1, 7: 1}

关键功率值的3.get产品

 2^3 * 3^2 * 5 * 7 = 2520
颜镜
2023-03-14

你的算法效率很低,但问题的核心是,你的结果字典为每个整数累加一个值,该值可以被1-20的数字整除,而你的while循环试图继续运行,直到它有20个这样的数字。

这是实现这种低效算法的一种正确方法:

def calculate():
    target = 20
    candidate = 1
    success = False
    divisors = range(1, target+1)
    while not success:
        for divisor in divisors:
            if candidate % divisor != 0:
                candidate += 1
                break
        else:
            success = True

    return candidate

请注意,etc子句确实在for循环上,而不是if。来自流控制教程:

循环语句可以有else子句;当循环通过耗尽列表终止(使用for)或当条件变为false(使用while)时执行,但当循环通过break语句终止时不执行。

更简洁的表达方式是:

candidate = 0
while not success:
    candidate += 1
    success = all((candidate % divisor == 0 for divisor in divisors))

它使用生成器表达式,因此所有都可以短路,并避免进行不必要的计算。

由于这是一个谜,我将继续建议更好的算法。

 类似资料:
  • 问题内容: 有什么简单的方法或功能可以确定python列表中的最大数量?我只可以编写代码,因为我只有三个数字,但是如果我可以使用内置函数或类似的东西告诉最大的代码,那么它将使代码的冗余度降低很多。 问题答案: 关于什么

  • 我有一个有点奇怪的问题。 我有一个“word”对象列表。“word”对象包含一个字符串myCWord,它等于传入word的字符串的规范版本。 规范形式是字符串中的排序字符。 现在我有了一个单词列表,在这里我可以访问它们所包含的字符串的规范版本。 我需要一个算法来创建“子列表”,这些列表包含一组单词,这些单词是每个单词的字谜。

  • 我有一个阵列 我想找到数组第一列的最大值,84 这是我的整个代码,它给我这个数组中每列的最大值

  • 我有一个任务需要完成:

  • 如何在不更改数组顺序的情况下找到int数组中的最小值? 代码段: 我不知道如何在tenIntArray中找到最小的数组值并显示位置 例如,数组包含- 输出应该说

  • 问题内容: 我希望能够在数字数组中找到最接近的较小值。例如,如果我有: 我正在寻找小于以下值的最接近值: 该函数将返回: 另外,如果我传递的数字大于数组中的最大值,则它应返回最大值。如果我传递的数字小于最小值,则应返回nil。 我尝试使用数组上的函数执行此操作,但是单独执行此操作不会产生我想要的结果,因为我需要这样的东西: 但不幸的是,这是无效的。有什么建议?我知道可以使用while循环轻松完成此