我正在尝试解决下面详述的一个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个。谢谢
许多其他答案提到原始代码效率低下,但它们仍然循环遍历几乎每个数字。利用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)
实际上,我有非常有效的算法来解决这个问题。我不会给你密码,但我可以给你指路
对于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
你的算法效率很低,但问题的核心是,你的结果字典为每个整数累加一个值,该值可以被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循环轻松完成此