Python的新手,并试图解决挑战,找到大数的素数因子。我很快遇到了一个障碍,其中包含了我想要的逻辑。从广义上讲,我的逻辑是:
所以在#2之后,我会得到一个素数列表,它们是原始数字的因子。在我意识到之后卡住了,我将不得不确定第二个列表中元素的组合,这些元素将组成原始数字,因为所有元素虽然是素数,但不能相互相乘以获得原始数字。
无论如何,经过一段时间的努力,我发现以下代码有助于我试图创建的功能。
def prime_factors(n):
# Returns all the prime factors of a positive integer
factors = []
d = 2
while n > 1:
while n % d == 0: #if no remainder
factors.append(d)
n /= d
d = d + 1
if d*d > n:
if n > 1: factors.append(n)
break
return factors
pfs = prime_factors(600851475143)
print(pfs)
total = sum(pfs)
并提供输出
[71, 839, 1471, 6857]
需要一些帮助来理解它是如何工作的,以及如何用9位数字这么快。我之前尝试过一些逻辑,这些逻辑要么不起作用,要么我的命令提示符处于挂起状态,试图计算这个大的素因子。
答案 0 :(得分:2)
您的代码速度很快,因为它使用了素性测试,an interesting topic。
继续阅读对于新手来说更简单的另一种解决方案,
这个函数将检查给定的整数n是否是素数,当我们将n除以i(初始化为2)时,如果结果为0 ,结果将是 False,因为一个素数只能被 1 或它本身整除,否则,i 将自增(增加)1,如果 i 是最后等于n,结果为True,因为n除以i的结果不等于0。< /p>
def prime(n):
for i in range(2,n): # letting i have multiple values starting from 2
if n % i == 0: # checking the remainder, if it's 0, then n is not prime,
return False # and so False will be returned,
else:
i += 1 # if n is still considered prime, i will become 3, then 4, and so on
# until it becomes equal to n
return True # if so, then n is prime, so True will be returned
这里我们将有一个名为 factors 的空列表,我们将在其中存储质因子,现在看看第 4 行,您会看到:如果 n % i == 0 和 i 是素数,我们将把它添加到我们的名为 factors 的列表中,只有当下面的两个表达式都为真时,我们才会这样做, 如果 n 除以 i 不等于 0 OR/AND i 不是质数 (意思是 prime(i) 返回了 False),我们不会再将 i 添加到我们的列表中,注意这个函数中的 i prime_factors 是一个整数这将被验证为 n 的因数并且也是质数。
def prime_factors(n):
factors = [] #initializing an empty list that will soon be modified
for i in range(2,n):
if (n % i == 0) and (prime(i)): # if i is a factor of n and also i is prime
factors.append(i) # the values will be added to our list named factors
return factors # this list contains the prime factors values which, we return it
给n一个值,然后显示质因数
n = 81210459 # the value of n
pfs = prime_factors(n) # storing our list returned from this function is the variable pfs
print("prime factors of",n,"are:",pfs) # showing the results (this is obvious isn't it :D)
输出:
Prime factors of 81210459 are: [3, 11, 61, 40343]