1

我写了一个小脚本来查找 e 的数字中的 n 位素数与那个旧的 Google 广告相关):

import math

# First 251 digits of e
e_digits = ("2"
            "7182818284 5904523536 0287471352 6624977572 4709369995"
            "9574966967 6277240766 3035354759 4571382178 5251664274"
            "2746639193 2003059921 8174135966 2904357290 0334295260"
            "5956307381 3232862794 3490763233 8298807531 9525101901"
            "1573834187 9307021540 8914993488 4167509244 7614606680")
e_digits = e_digits.replace(" ", "")

digits = int(raw_input("Number of digits: "))
print "Finding ", str(digits) + "-digit primes in the first", len(e_digits), "digits of e."

numbers = []
primes = []

# Creates list of numbers based on variable digits
for n in range(0,len(e_digits) - (digits - 1)):
    test_number = e_digits[n:n+digits]
    numbers.append(int(test_number))

# Checks each number for divisors smaller than its sqrt, then appends to list primes
for n in numbers:
    n_sqrt = int(math.floor(math.sqrt(n)))
    div = []
    for i in range(2,n_sqrt+1):
        if n % i == 0:
            div.append(i)
    if div == []:
        primes.append(n)

print primes

但是,当我设置数字 = 10 时,会打印:

[7427466391L, 7413596629L, 6059563073L, 3490763233L, 2988075319L, 1573834187, 7021540891L, 5408914993L]

除了第 6 个列表条目之外,所有列表条目都与“L”连接,我不知道为什么。当我在 IDLE 和 CMD 中运行代码时会出现问题,尽管只有在使用此特定代码附加十位整数时才会出现问题。

在最后一个 for 循环的 if 语句中,如果我打印 n,或者如果我在附加之前将 n 转换为字符串,则会打印正确的数字。但是,然后再次转换为整数会产生同样的问题。

数字 = 11 时也会出现问题,但数字 < 10 时不会出现问题。

我终生无法找到错误(或者弄清楚是否有错误,真的)。对此的一些建议将不胜感激。

4

1 回答 1

0

您的代码运行良好,您看到的也正常。这些是Python long integers的文字表示。

打印列表时,列表的内容作为表示形式打印,与repr()函数给出的输出相同。另一种方法是打印列表的各个元素。

但是,您不必担心长表示。这只是 Python 整数泄漏的一个实现细节:

>>> 1234567890
1234567890
>>> type(1234567890)
<type 'int'>
>>> 12345678901234567890
12345678901234567890L
>>> type(12345678901234567890)
<type 'long'>

在这里,Python 解释器也将表达式的结果打印为repr()表示形式。大于的整数自动变为整数。sys.maxintlong

引用文档:

纯整数(也称为整数)是使用longC 实现的,这为它们提供了至少 32 位的精度(sys.maxint始终设置为当前平台的最大纯整数值,最小值为-sys.maxint - 1)。长整数具有无限精度。

未经修饰的整数文字(包括二进制、十六进制和八进制数)会产生纯整数,除非它们表示的值太大而无法表示为纯整数,在这种情况下,它们会产生长整数。带有'L'or'l'后缀的整数文字产生长整数('L'因为1l看起来太像十一了!)。

完全支持和透明的常规和长整数之间的比较和算术:

Python 完全支持混合算术:当一个二元算术运算符具有不同数字类型的操作数时,具有“较窄”类型的操作数被扩大到另一个,其中纯整数比长整数窄比浮点比窄复杂的。混合类型的数字之间的比较使用相同的规则。

Python 3 完全消除了这种区别。

于 2013-07-13T17:56:10.683 回答