问题陈述如下:
2520是最小的数,可以除以从1到10的每一个数,没有任何余数。 什么是最小的正数,可以被从1到20的所有数字整除?
这是我的解决方案:
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值:
x=17
n=2
z=x/n=8在这里,z%2==0是有效的,这不应该是这样的,因为它实际上在数学中是无效的。
2)浮点值:
x=17.0
n=2.0
z=x/n=8.5这里,z%n != 0 --应该是这样的。
发布于 2015-08-05 19:47:21
就像其他人提到的,只要找到lcm,这里有一个简单的方法。记住lcm(a,b,c) = lcm(a,lcm(b,c))。所有这些都是:
from fractions import gcd
print(reduce(lambda a, b: a * b / gcd(a, b), range(1, 21)))如果您想编写自己的gcd函数,它的工作方式如下(algorithm):
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a发布于 2015-08-05 19:28:36
首先,正如我在评论中所说,你为什么要用蛮力的方式去做呢?在几秒钟内,你可以更容易地计算数字1到20的LCM。
其次,你的代码行
if z%2==0:
list.append(n)这实际上给出了你想要的两倍的答案,因为这个语句导致你计算LCM* 2,因为它必须被分解成一个额外的因子2。
正确的答案是232792560,这是我用一张纸和一个计算器在<20秒内计算出来的。正如你所看到的,你得到的答案是双倍
<--编辑我以前的代码是错误的。这个工作->
您可以通过执行以下操作来纠正这一问题:
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,您可以这样做:
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)发布于 2015-08-05 20:08:56
这类%算子被称为模算子。在英语中:a % b被读为"a mod b“,意思是”a/b的其余部分“。所以100%3=1和12%5=2。
检查可分性的一种常见方法是检查“我的数字模我的除数等于0吗?”或者在代码中:
if a%b == 0:
print("b divides a!")在您的代码中,您希望检查n是否将x分开。你查过:
z=x/n
if z%2==0:
print("n divides x?") #No not reallyz是x和n的商数。if z%2==0可以解释为“如果z可被2整除”。所以你会问,“x和n的商数可以除以2吗?”当然远没有达到你想要的程度。而只是简单地做
if x%n==0:
print("n divides x?") # YES!我建议您做几个python教程,以便在尝试问题之前了解基本知识。:)
如果你还需要帮助,请告诉我。:)
https://stackoverflow.com/questions/31840761
复制相似问题