所以这里有两个函数来查找数字的素因子。 致谢:三联画 https://stackoverflow.com/a/412942/6211963
def prime_factors1(n):
"""Returns all the prime factors of a positive integer"""
factors = []
d = 2
while n > 1:
while n % d == 0:
factors.append(d)
n /= d
d = d + 1
return factors
def prime_factors2(n):
"""Returns all the prime factors of a positive integer"""
factors = []
d = 2
while n > 1:
while n % d == 0:
factors.append(d)
n /= d
d = d + 1
if d*d > n:
if n > 1: factors.append(n)
break
return factors
显然第二个代码的运行速度要快得多,但为什么它输出的最大因子是long-type而不是int?
>>> prime_factors1(65126264424)
[2, 2, 2, 3, 13, 29, 7197863]
>>> prime_factors2(65126264424)
[2, 2, 2, 3, 13, 29, 7197863L]
答案 0 :(得分:5)
区别如下。在prime_factors1(n)
中,最后一个因素附加在此处:
while n > 1:
while n % d == 0:
factors.append(d)
其中d
始于2
(无论在哪个运行时间,肯定是int
),通过d = d + 1
增加(增加两个int
)和 - 当它作为因素附加时 - 代表7197863
(仍为int
)。
但是,在prime_factors2(65126264424)
中,您在此处附加最后一个因素:
if d*d > n:
if n > 1: factors.append(n)
其中n
从65126264424
开始,并通过n /= d
缩小。如果n
以long
开头(n
为long
且d
为int
,则不会更改long
的类型,无论多小,结果仍然是65126264424
。因此,问题变为: long
是(2**31 - 1)
吗?
答案取决于你的python运行时:
2147483647
或65126264424
,小于(2**63 - 1)
。9223372036854775807
或65126264424
,大于sys.maxint
。查看65126264424
的输出,它应小于 public function sanitizeString($string){
$sanitized_string = htmlentities(mysqli_real_escape_string($this->conn, trim($string)));
return $sanitized_string;
}
。