3

私は isprime(n) という関数を書きました。この関数は、数値が素数の場合は True を返し、そうでない場合は False を返します。関数を定義された回数ループすることができます。しかし、x個の素数が見つかるまで反復する方法がわかりません。For ループと While ループについては十分に理解しているように感じますが、ブール値の戻り値をループに統合する方法については混乱しています。ここに私の現在のコードとエラーがあります:

エラー結果:

input:100
Traceback (most recent call last):
File "euler7.py", line 25, in <module>
primeList += 1
TypeError: 'int' object is not iterable

そしてコード:

def isprime(n):
    x = 2
    while x < sqrt(n):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))

primeList = []
primesFound = 0

while primesFound != userinput:
    i = 2
    if isprime(i):
        primeList.append(i)
        primeList += 1
        i += 1
    else:
        i += 1

編集(更新された機能コードを含む):

from math import sqrt
def isprime(n):
    x = 2
    while x < (sqrt(n) + 1):
        if n % x == 0:
            return False
        else:
            x += 1
    return True

userinput = int(raw_input('input:'))
primeList = []
primeList.append(2)

i = 2
while len(primeList) != userinput:
    if isprime(i):
        primeList.append(i)
        i += 1
    else:
        i += 1

print 'result:', primeList[-1]
4

5 に答える 5

2

この行:

primeList += 1

次のようにする必要があります。

primesFound += 1
于 2013-05-10T02:25:50.250 に答える
2

intおよびを python に追加することはできませんlistprimesFound += 1希望する結果を得るために行う必要があります。

さらに、あなたのisprime機能は間違っています。関数のループに対してTrue行う必要があります。while x < sqrt(n) + 1whileisprime

したがって、次のものが必要です。

def isprime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
        else:
            x += 1
    return True
于 2013-05-10T02:27:15.783 に答える
1

他の人が指摘しているように:

  • primesFoundではなく、インクリメントする必要がありますprimeList
  • このisprime()関数にはバグがTrueあり、9を返しますsqrt(n) + 1

加えて:

  • ループiの外で初期化する必要があります。whileそれ以外の場合は、単純に 2 のリストを作成します。
  • の必要はありませんprimesFound。ただチェックしてくださいlen(primeList)

そして、私のペットのおしっこ:

  • コマンドライン プログラムは、特別な状況でのみインタラクティブなユーザー入力に頼るべきです。可能であれば、パラメーターをコマンドライン引数またはオプションとして使用してください。例: userinput = int(sys.argv[1]).
于 2013-05-10T02:50:45.060 に答える
1

nある条件を満たす数値を取得するには、itertools.islice()関数とジェネレータ式を使用できます。

from itertools import count, islice

n = int(raw_input('number of primes:'))
primes = list(islice((p for p in count(2) if isprime(p)), n))

where(p for p in count(2) if isprime(p))は無限に素数を生成するジェネレータ式です ( と書くこともできますitertools.ifilter(isprime, count(2)))。

エラトステネスのふるいアルゴリズムを使用して、より効率的なソリューションを得ることができます。

def primes_upto(limit):
    """Yield prime numbers less than `limit`."""
    isprime = [True] * limit
    for n in xrange(2, limit):
        if isprime[n]:
           yield n
           for m in xrange(n*n, limit, n): # mark multiples of n as composites
               isprime[m] = False

print list(primes_upto(60))
# -> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59]

Python で N 以下のすべての素数を一覧表示する最速の方法を参照してください。

注:limit / (log(limit) - 1)未満の素数が約ありlimitます。

などの無限素数ジェネレータを使用しgen_primes()て、最初のn素数を取得することもできます。

primes = list(islice(gen_primes(), n))

Python で素数の効率的な無限ジェネレーターを実装する方法を参照してください。

于 2013-05-10T03:18:55.433 に答える
0
def is_prime(n):
    x=2
    while x < sqrt(n) +1:
        if n % x == 0:
            return False
            break
        else:
            x += 1
    return True
于 2014-12-01T13:38:59.200 に答える