首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化Project Euler #5的Python代码(从1到20所有数字的LCM)

优化Project Euler #5的Python代码(从1到20所有数字的LCM)
EN

Code Review用户
提问于 2014-01-29 22:21:45
回答 2查看 161关注 0票数 2

这是我对欧拉计划的第五个问题的解决方案,它要求从1到20 (含)的数字的最小公共倍数。是否有任何方法来改进while循环条件而不是使用sum?

代码语言:javascript
复制
table = range(1, 21)
result = 1
pf = 2
while sum(table) > len(table):
   flag = False
   for x, y in enumerate(table):
      if y % pf == 0:
         table[x] = y/pf 
         flag = True
   if flag:
      result *= pf
   else:
      pf += 1
print result
EN

回答 2

Code Review用户

回答已采纳

发布于 2014-01-30 09:29:51

您的目的是在table中的所有条目变为1时终止循环。

代码语言:javascript
复制
while sum(table) > len(table):

是一种相当模糊的表达意图的方式。我建议你

代码语言:javascript
复制
while max(table) > 1:

或者更明显的短路

代码语言:javascript
复制
while any(x > 1 for x in table):
票数 2
EN

Code Review用户

发布于 2014-01-30 04:42:00

用常量。当你想回去尝试不同的价值时,就更容易理解了。

复制我的答案从堆栈溢出,也改变了周围的事情,因为这是代码审查。

代码语言:javascript
复制
MAX_FACTOR = 20 #The largest divisor we want to be able to divide by

#should have a general outline of the algorithm here
table = range(1,MAX_FACTOR + 1)
result = 1 #final result is stored here
currentFactor = 2 #what we're currently trying to divide by
while currentFactor <= MAX_FACTOR:
   isDivisor = False #is the currentFactor a divisor
   for x,y in enumerate(table):
      if y % currentFactor == 0:
     table[x] = y/currentFactor 
     isDivisor = True
   if isDivisor:
      result *= currentFactor
   else:
      currentFactor += 1
print result
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/40402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档