为啥这个python中最大的主要因素的代码不能正常工作
Posted
技术标签:
【中文标题】为啥这个python中最大的主要因素的代码不能正常工作【英文标题】:Why doesnt this code for the biggest prime factor in python work correctly为什么这个python中最大的主要因素的代码不能正常工作 【发布时间】:2017-05-07 14:05:25 【问题描述】:所以我对 python 很陌生,想知道为什么这段代码不适用于某些数字。 (例如 12 和 60)(编辑:它只是说一个因数,不是素数。12 是 4,60 是 12)
def Prime(var):
for n in range(var-1, 1, -1):
if var % n == 0:
for x in range(2, n):
if n % x == 0:
n = n-1
continue
else:
if (var % n == 0):
print("the largest prime factor of", var, "is", n)
break
n = n-1
continue
break
else:
print(var, "is already a prime number")
我很确定,有多行代码是不需要的,而且这段代码效率很低,但我真的不明白为什么这行不通。因此,如果有人可以在这里帮助我并修复它,那就太好了。
提前致谢
【问题讨论】:
解释如何它不起作用。是有错误,还是只是产生了错误的输出? @JohnColeman 我怀疑第一行下的所有内容都需要缩进一级,这只是因为 OP 不熟悉 SO 代码块的工作方式。 在 Stack Overflow 中发布代码可能很棘手。在诸如 Java 之类的某些语言中,这并不重要(很多),但在 Python 中,它可以无可救药地混淆逻辑。在实践中我们可以猜出你的意思,但有时我们猜错了。我建议简单地删除代码,然后在阅读后将其放回:meta.stackexchange.com/questions/22186/… @JohnColeman 其他明显的缩进错误不是错误 - OP 在其 for 循环中使用 else 子句。 OTOH,代码没有做他们期望的事情,例如在 for 循环结束时使用n
作为循环变量做n=n-1
是无用的。
@PM2Ring else
子句可能在 for 循环中(通常不教初学者),但它们也可能与一些 if
语句一起使用,并且不知何故变得乱码通过OP尝试粘贴代码。无论哪种情况,逻辑都很模糊。我宁愿 OP 修复缩进,也不愿猜测它是什么。
【参考方案1】:
您的函数对于某些值会失败,因为它假定如果 n
除以 var
则 n-1
不会。对于 6 的倍数,这是不正确的。 n = 3
和 n-1 = 2
都将其分开。 (对于 60 来说,6 和 5 也会出现问题)。
您的核心逻辑是首先找到一个除数,然后检查(通过穷举除法)该除数是否为素数。你的逻辑很复杂,因为你试图让你的函数 print 结果。让函数返回最大的素数并将任何打印留给调用代码是一种更简洁的设计。
你的核心算法可以这样表达:
def largest_prime(var):
""""returns the largest prime divisor of var"""
for n in range(var-1,1,-1):
if var % n == 0:
#check if n is prime, if so - return it
for x in range(2,n):
if n % x == 0:
#n isn't prime, so
break
else:
return n #if we get here, we know that n is prime
return var #we only get to this point if no divisors of var have been found
例如:
>>> largest_prime(60)
5
>>> largest_prime(12)
3
>>> largest_prime(7)
7
前两种情况是您的代码失败的情况。
代码仍然非常低效,但原因与数论有关,而不是 Python。
编辑时:这是一种更有效但仍不是最佳的寻找最大素数的方法。它基于首先找到最小素数,将数字除以该素数,然后将素数与所得商中的最大素数进行比较。它利用了一个数字的最小素数除数小于或等于其平方根的事实:
import math
def biggest_prime(var):
for p in range(2,1 + math.ceil(math.sqrt(var))):
if var % p == 0:
return max(p,biggest_prime(var//p))
return var
largest_prime(10**7 + 1)
和 biggest_prime(10**7 + 1)
都返回 909091
,但第一个函数需要几秒钟,而第二个函数几乎是瞬时的。对于biggest_prime(10**9 + 1)
与largest_prime(10**9+1)
,结果更加引人注目。我在几分钟后没有输出就杀死了largest_prime(10**9+1)
,而biggest_prime(10**9 + 1)
仍然几乎是瞬时的。
【讨论】:
谢谢,但你能解释一下,为什么这不适用于打印? 不知道如何在 cmets 中发布代码,但我只是使用了print
函数和 print
函数和 break
来代替第一个 else
,第二个我使用了 else
带有print
函数的子句。这似乎工作得很好
如果您在打印后立即有return
(或break
),它将与print
一起使用。一旦你知道最终结果应该是什么,确保你的代码正确地传递函数的其余部分是没有意义的。我上面写的代码假设如果你达到了底线,那么你就知道var
是排除过程中的素数。如果你不早点回来,这个逻辑就会崩溃。当然,你可以做不同的事情,但一般来说,函数应该返回值而不是打印结果。以上是关于为啥这个python中最大的主要因素的代码不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章
PYTHON 为啥我的 python IDLE 不能将 numpy 识别为模块,尽管在 cmd 中运行 pythob 时可以正常使用 numpy?