由两部分组成的问题:
这是我在网上找到的素因式分解代码[注:此代码不正确。有关更好的代码,请参见下面Stefan的回答。]:
n = 600851475143
i = 2
while i * i < n:
while n % i == 0:
n = n / i
i = i + 1
print(n)
#takes about ~0.01secs
i = 1
while i < 100:
i += 1
#takes about ~3secs
看起来人们在做项目Euler的事情,你自己编写解决方案。对于所有想完成工作的人来说,primefac模块可以非常快速地完成大量数据:
#!python
import primefac
import sys
n = int( sys.argv[1] )
factors = list( primefac.primefac(n) )
print '\n'.join(map(str, factors))
好啊所以你说你了解基本知识,但你不确定它到底是如何工作的。首先,这是对项目Euler问题的一个很好的回答。我对这个问题做了很多研究,这是迄今为止最简单的回答。
为了便于解释,我让n=20。要运行真正的Project Euler问题,请让n=600851475143。
n = 20
i = 2
while i * i < n:
while n%i == 0:
n = n / i
i = i + 1
print (n)
此说明使用了两个while循环。关于while循环,要记住的最大一点是,它们一直运行,直到不再是true。
外部循环指出,虽然i*i
不大于n
(因为最大质因数永远不会大于n
的平方根),在内部循环运行后将1
添加到i
。
内部循环指出,当i
均匀划分为n
时,将n
替换为n
除以i
。此循环连续运行,直到不再为真。对于n=20
和i=2
,n
被替换为10
,然后再次被5
。因为2
不均匀划分为5
,循环以n=5
停止,外循环结束,产生i 1=3
。
最后,由于3squared大于5,外部循环不再是true,并打印n的结果。
谢谢你发布这个。在意识到它是如何工作的之前,我一直在看代码。希望这是您在回复中寻找的内容。如果没有,请告诉我,我可以进一步解释。
这个问题是我在谷歌上搜索“python质数分解”
时弹出的第一个链接。正如@quangpn88所指出的,对于像n=4,9,16,...
这样的完美方块,这个算法是错误的(!)但是,@quangpn88的修复也不起作用,因为如果最大的质数因子出现3次或更多次,它会产生不正确的结果,例如,n=2*2*2=8
或n=2*3*3*3 = 54
。
我认为Python中正确的暴力算法是:
def largest_prime_factor(n):
i = 2
while i * i <= n:
if n % i:
i += 1
else:
n //= i
return n
不要在性能代码中使用它,但对于具有适度大数字的快速测试是可以的:
In [1]: %timeit largest_prime_factor(600851475143)
1000 loops, best of 3: 388 µs per loop
如果寻求完全素数分解,这是蛮力算法:
def prime_factors(n):
i = 2
factors = []
while i * i <= n:
if n % i:
i += 1
else:
n //= i
factors.append(i)
if n > 1:
factors.append(n)
return factors
问题内容: 我正在使用下面的代码寻找2500的主要因子,但是我的代码当前仅显示2,因此我不确定为什么会这样。 谢谢 问题答案: 使用 erathesthenes筛子首先生成素数列表:
我试图解决欧拉项目问题3,即: 13195的主要因子为5、7、13和29。数字600851475143中最大的素因子是什么? 这是我的解决方案,它适用于较小的值,但对于所需的数字却无法完成:
sys.path Python import 时会首先寻找 sys.path 中列出的路径,通常是这样: >>> import sys >>> '\n'.join(sys.path) /usr/lib/python2.7 /usr/lib/python2.7/plat-x86_64-linux-gnu /usr/lib/python2.7/lib-tk /usr/lib/python2.7/li
Appium 支持 WebDriver 定位策略的子集: 通过 "class" 查找 (例如, UI 组件的类型) 通过 "xpath" 查找 (例如, 一个元素的路径以抽象的方式去表达,具有一定的约束) 你可以查看关于以上的列表,选择器策略 (English)。 Appium 还额外支持部分 Mobile JSON Wire Protocol 的定位策略。 -ios predicate stri
题目描述: 给定一个字符串 s ,找出这样一个子串: 1)该子串中的任意一个字符最多出现2次; 2)该子串不包含指定某个字符; 请你找出满足该条件的最长子串的长度。 输入描述: 第一行为要求不包含的指定字符,为单个字符,取值范围[0-9a-zA-Z] 第二行为字符串s,每个字符范围[0-9a-zA-Z],长度范围[1,10000] 输出描述: 一个整数,满足条件的最长子串的长度;如果不存在满足