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 でコードを実行すると問題が発生しますが、この特定のコードを使用して 10 桁の整数を追加する場合のみです。

最後の for ループの if ステートメントでは、n を出力するか、追加する前に n を文字列に変換すると、正しい数値が出力されます。ただし、整数に再度変換すると、同じ問題が発生します。

この問題は桁数 = 11 でも発生しますが、桁数 < 10 では発生しません。

私は一生、エラーを見つけることができません(または、実際にエラーがあるかどうかを判断することはできません)。これに関するアドバイスをいただければ幸いです。

4

1 に答える 1

0

あなたのコードは正常に動作しており、表示される内容は正常です。これらはPython long integerのリテラル表現です。

リストを印刷するとき、リストの内容は表現として印刷され、repr()関数が与える出力と同じです。別の方法は、リストの個々の要素を代わりに出力することです。

ただし、長い表現について心配する必要はありません。これは、リークする Python 整数の実装の詳細にすぎません。

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

ここで、Python インタープリターは式の結果を表現として出力repr()ます。より大きい整数は、sys.maxint自動的にlong整数になります。

ドキュメントの引用:

プレーン整数 (単に整数とも呼ばれる) はlongC を使用して実装され、少なくとも 32 ビットの精度が得られます (sys.maxintは常に現在のプラットフォームのプレーン整数の最大値に設定され、最小値は です-sys.maxint - 1)。長整数の精度は無制限です。

装飾のない整数リテラル (2 進数、16 進数、および 8 進数を含む) は、それらが表す値が大きすぎて単純な整数として表現できない場合を除き、単純な整数を生成します。'L'または'l'サフィックスが付いた整数リテラルは、長い整数を生成します ( 11 に似すぎている'L'ため、推奨されます!)。1l

通常の整数と long 整数の間の比較と算術演算は完全にサポートされており、透過的です。

Python は混合演算を完全にサポートします: 二項算術演算子が異なる数値型のオペランドを持つ場合、「より狭い」型のオペランドは他の型のオペランドに拡張されます。ここで、単純な整数は長整数よりも狭く、浮動小数点よりも狭くなります。繁雑。混合タイプの数値間の比較では、同じ規則が使用されます。

Python 3 では、この区別が完全に取り除かれました。

于 2013-07-13T17:56:10.683 に答える