所以我需要使用python程序找到数字的素因子,我能够找到所有因素:
def primeFactors(n):
list = []
for x in range(2,n//2):
if n % x == 0:
list.append(x)
return list
但是我不明白我是怎么想让程序忽略多个主要因素的因素。
我找到了以下代码:
def primes(n):
divisors = [ d for d in range(2,n//2+1) if n % d == 0 ]
return [ d for d in divisors if \
all( d % od != 0 for od in divisors if od != d ) ]
但我实际上并不了解它的作用,这是一项作业,所以我不能只复制和粘贴。
所以我想知道是否有人可以引导我朝着我想要做的正确方向前进。此外,我不能使用任何花哨的功能,主要使用内置的东西,如循环和列表和基本数学。我使用的是python 2.7而不是3.0。
答案 0 :(得分:1)
除数得到所有可能的除数,与你在代码中完成的相同。
返回的值[ d for d in divisors if \
all( d % od != 0 for od in divisors if od != d ) ]
如果所有其他可能的除数d
不能被任何其他除数整除,则保持除数d
。如果传递给它的所有值都为真,则all
返回true,all
中的表达式只检查给定的除数d
是否不是任何其他除数od
的除数你的清单。通过这种方式,返回的最终值列表仅包括不是已存在因子的倍数的除数。
答案 1 :(得分:0)
def primes(n):
divisors = [ d for d in range(2,n//2+1) if n % d == 0 ]
return [ d for d in divisors if \
all( d % od != 0 for od in divisors if od != d ) ]
使用一个例子,比如n = 12 除数将是以下列表[2,3,4,6]
现在return
部分有点棘手,并且有充分的理由,不应该以这种方式滥用列表理解。
所以让我们把这个部分变成一个实际的循环:
ans = []
for d in divisors:
for od in divisors:
if od != d:
if d % od == 0:
break
else: ans.append(d)
return ans
是的,其他地方在正确的位置
继续这个例子,这部分的作用是搜索除数列表,看看它们中的任何一个是否可以被任何其他除数整除。如果是这样,我们会忽略那个,否则我们会保留它。
最终结果是一系列素数因素。
我在评论中也提到过,除数列表也可以使用:
生成divisors = [2] + [ d for d in xrange(3,int(n**2+1), 2) if n % d == 0]
这种方法很有用,因为它避免包含除2以外的偶数,这是唯一的素数。除数的大小也较小,因为我们只检查一个数字的平方根,该数字的大小小于数字除以2的数字