首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化eulerproject解决方案5-最小倍数

优化eulerproject解决方案5-最小倍数
EN

Stack Overflow用户
提问于 2017-07-18 19:36:50
回答 2查看 224关注 0票数 2

如何优化我的代码?我花了大约3分钟才终于得到了答案。

这是m码:

代码语言:javascript
复制
def myfunc():
    smallest = 0;
    while True:
        smallest +=1
        for x in range(1, 21):
            if smallest % x != 0:
                break
            else:
                if x == 20:
                    print(smallest)
                    return
myfunc()

谢谢:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-18 19:43:01

您可以简单地生成从1到(包括) 20之间的所有元素中最不常见的倍数。

三个(或更多个) lmc(a,b,c) == lmc(lmc(a,b),c)的最小公共倍数(lcm)。

现在,为了计算最小公共倍数,我们可以使用欧几里德算法计算最大公因子(gcd):

代码语言:javascript
复制
def gcd(x,y):
    while y != 0:
        x, y = y, x % y
    return x

所以现在我们可以用lcm来定义gcd

代码语言:javascript
复制
def lcm(x,y):
    return x*y//gcd(x,y)

然后让它成为一个清单:

代码语言:javascript
复制
def lcm_list(x,*args):
    for y in args:
        x = lcm(x,y)
    return x

所以现在我们可以像:

代码语言:javascript
复制
lcm_list(*range(1,21))

这就产生了:

代码语言:javascript
复制
>>> lcm_list(*range(1,21))
232792560

它可以除以从1到20的每一个数字:

代码语言:javascript
复制
>>> [232792560%i for i in range(1,21)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
票数 1
EN

Stack Overflow用户

发布于 2017-07-18 22:58:23

这个问题可以解析地解决。不需要编程。

逻辑如下:如果n除以一个数字k,那么它也会对k * m进行划分。因此,我们正在寻找的数字是所有数字n的乘积,它不能写成集合中任何较小数字的乘积。

这些数字都不可能是非素数幂复合数,否则它是集合中较小数的乘积,但另一方面,它必须包含小于20的所有素数幂,因为它们不是集合中任何较小数的乘积。由于我们知道素数(记住,或者参考某个列表/写函数),我们现在有了一个解决方案。

因此我的代码是

代码语言:javascript
复制
>>> (2 ** 4) * (3 ** 2) * 5 * 7 * 11 * 13 * 17 * 19
232792560
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45175619

复制
相关文章

相似问题

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