首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python的Euler #5项目

使用python的Euler #5项目
EN

Stack Overflow用户
提问于 2015-08-05 19:02:20
回答 7查看 5.6K关注 0票数 2

问题陈述如下:

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

这是我的解决方案:

代码语言:javascript
运行
复制
x=2520.0
list=[]
true_list=[11.0, 12.0, 13.0, 14.0, 16.0, 17.0, 18.0, 19.0, 20.0]
b=1
def test():
    for n in true_list:
        z=x/n
        if z%2==0:
            list.append(n)
while b==1:
    test()
    if list==true_list:
        b=2
        print x
    else:
        x=x+20
        list=[]

-> --基本上,我定义了一个由函数test()填充的空列表。什么样的test()检查给定的数字(在本例中为x)是否可被11-20的值整除。如果是,则将该值(介于11-20之间)放置在空列表中。

当test()运行它的过程时,程序检查列表是否等于预定义的true_list,其中包含11-20的所有数字。如果是的话,x是打印出来的。否则,程序在增加x的值后继续运行。

这意味着,如果list等于true_list,那么11-20中的所有数字都是均匀地除以我们的数字(x),这就是问题中所要求的。

它给出了答案: 465585120.0在跑了一分钟左右。这恰好是不正确的。我不知道这是为什么。我一直试图解决这个问题已经8+几个小时了,现在我的智慧已经到了极限。错误是什么?

您不需要提前阅读,但是如果您对我为什么在解决方案中使用某些内容有疑问,那么我在这里讨论了其中的一些:

->I没有使用true_list中的所有20个数字来加速程序,因为任何可以被11-20整除的数字也可以被1-20整除。

->I使用x=x+20来加速程序,因为它和x=x+1或x+2;only一样有效,它更快。

->I之所以使用浮点值,是因为我在函数'test()‘中使用了z=x/n,而且我不想删除小数点部分,因为这样做甚至可以使浮点数符合后续操作(即z%2 )的要求。

示例:

1)对于int值:

代码语言:javascript
运行
复制
x=17
n=2
z=x/n=8

在这里,z%2==0是有效的,这不应该是这样的,因为它实际上在数学中是无效的。

2)浮点值:

代码语言:javascript
运行
复制
x=17.0
n=2.0
z=x/n=8.5

这里,z%n != 0 --应该是这样的。

EN

回答 7

Stack Overflow用户

发布于 2015-08-05 19:47:21

就像其他人提到的,只要找到lcm,这里有一个简单的方法。记住lcm(a,b,c) = lcm(a,lcm(b,c))。所有这些都是:

代码语言:javascript
运行
复制
from fractions import gcd

print(reduce(lambda a, b: a * b / gcd(a, b), range(1, 21)))

如果您想编写自己的gcd函数,它的工作方式如下(algorithm):

代码语言:javascript
运行
复制
def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a
票数 3
EN

Stack Overflow用户

发布于 2015-08-05 19:28:36

首先,正如我在评论中所说,你为什么要用蛮力的方式去做呢?在几秒钟内,你可以更容易地计算数字1到20的LCM。

其次,你的代码行

代码语言:javascript
运行
复制
if z%2==0:
        list.append(n)

这实际上给出了你想要的两倍的答案,因为这个语句导致你计算LCM* 2,因为它必须被分解成一个额外的因子2。

正确的答案是232792560,这是我用一张纸和一个计算器在<20秒内计算出来的。正如你所看到的,你得到的答案是双倍

<--编辑我以前的代码是错误的。这个工作->

您可以通过执行以下操作来纠正这一问题:

代码语言:javascript
运行
复制
x=2520.0
list=[]
true_list=[11.0, 12.0, 13.0, 14.0, 16.0, 17.0, 18.0, 19.0, 20.0]
b=1
def test():
     for n in true_list:
        if x%n==0:
            list.append(n)
while b==1:
    test()
    if list==true_list:
        b=2
        print(x)
    else:
        x=x+20
        list=[]

通过计算LCM,您可以这样做:

代码语言:javascript
运行
复制
allFactors={}
#for each divisor (ignore 1 as it can divide into everything)
for n in range(2,21,1):
    factors={}
    i=2
    while i<=n:
        while n%i==0:
            try:
                factors[i]+=1
            except KeyError:
                factors[i]=1
            n=n/i
        i+=1

    for pf,v in factors.iteritems():
        try:
            if allFactors[pf] < v:
                allFactors[pf]=v
        except KeyError:
            allFactors[pf]=v
lcm=1
for pf,v in allFactors.iteritems():
    lcm=lcm*(int(pf)**v)

print(lcm)
票数 0
EN

Stack Overflow用户

发布于 2015-08-05 20:08:56

这类%算子被称为模算子。在英语中:a % b被读为"a mod b“,意思是”a/b的其余部分“。所以100%3=112%5=2

检查可分性的一种常见方法是检查“我的数字模我的除数等于0吗?”或者在代码中:

代码语言:javascript
运行
复制
if a%b == 0:
    print("b divides a!")

在您的代码中,您希望检查n是否将x分开。你查过:

代码语言:javascript
运行
复制
z=x/n
if z%2==0:
    print("n divides x?") #No not really

zxn的商数。if z%2==0可以解释为“如果z可被2整除”。所以你会问,“x和n的商数可以除以2吗?”当然远没有达到你想要的程度。而只是简单地做

代码语言:javascript
运行
复制
if x%n==0:
    print("n divides x?") # YES!

我建议您做几个python教程,以便在尝试问题之前了解基本知识。:)

如果你还需要帮助,请告诉我。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31840761

复制
相关文章

相似问题

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