Python显示整数?

Kev*_*vin 2 python python-2.7 long-integer

所以这里有两个函数来查找数字的素因子.致谢:Triptych /sf/answers/28905971/

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        
Run Code Online (Sandbox Code Playgroud)

显然第二个代码的运行速度要快得多,但为什么它输出的最大因子是long-type而不是int?

>>> prime_factors1(65126264424)
[2, 2, 2, 3, 13, 29, 7197863]

>>> prime_factors2(65126264424)
[2, 2, 2, 3, 13, 29, 7197863L]
Run Code Online (Sandbox Code Playgroud)

sch*_*ggl 5

不同之处如下.在prime_factors1(n),最后一个因素附在此处:

while n > 1:
    while n % d == 0:
        factors.append(d)
Run Code Online (Sandbox Code Playgroud)

从哪里d开始2(绝对是一个int无论哪个运行时),通过d = d + 1(增加两个int)增长和 - 当它作为一个因素附加时 - 站在7197863(仍然是int).

prime_factors2(65126264424),但是,你在这里的附加最后一个因素:

if d*d > n:
    if n > 1: factors.append(n)
Run Code Online (Sandbox Code Playgroud)

从哪里n开始65126264424并缩小通过n /= d.这不会改变n它开始时的类型long(如果n是a long并且d是a int,结果仍然是long无论多小).现在的问题变成,因此:65126264424一个long

答案取决于你的python运行时:

  1. 在32位运行时中,通常具有32位整数,其最大值为(2**31 - 1)2147483647小于65126264424.
  2. 在64位运行时中,通常有64位整数,最大值为(2**63 - 1)9223372036854775807大于65126264424.

看输出,sys.maxint它应该小于65126264424.