0
def generate_primes(n):
    """generate_primes(n) -> list
    Returns a list of all primes <= n."""
    from math import sqrt
    primes = [2]
    potentialPrimes = []
    for x in range(3, n + 1):
        potentialPrimes.append(x)
        if x % 2 == 0:
            potentialPrimes.remove(x)
    currentPrime = potentialPrimes[0]
    primes.append(currentPrime)
    while currentPrime < sqrt(n):
        for x in potentialPrimes:
            if x % currentPrime == 0:
                potentialPrimes.remove(x)
        currentPrime = potentialPrimes[0]
    for x in potentialPrimes:
        primes.append(x)
    print(primes)

generate_primes(100)

関数を呼び出そうとすると、次のように表示されます。

[2, 3, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

理由はありますか?また、私のコードを改善する方法も大歓迎です。

4

2 に答える 2

1

while ループでは currentPrime =5 を設定しますが、潜在的な素数から削除しないため、次の反復で potentialPrimes[0] は 5 のままです。5%5==0 であるため、潜在的な素数から削除し、7 で同じことを行います。

これは同じスタイルのコードですが、すべての数字を正しく表示しています

def generate_primes(n):
  from math import sqrt
  primes=[]
  potentialPrimes=range(2,n+1)
  prime=potentialPrimes[0]
  while prime<sqrt(n):
      primes.append(prime)
      potentialPrimes.remove(prime)
      for potential in potentialPrimes:
          if potential%prime==0:
              potentialPrimes.remove(potential)
      prime=potentialPrimes[0]

  for potential in potentialPrimes:
      primes.append(potential)
  for number in primes:
      print number
于 2013-07-31T22:26:23.487 に答える
0

繰り返しながらリストからアイテムを削除することは決して良い考えではありません

    for x in potentialPrimes:
        if x % currentPrime == 0:
            potentialPrimes.remove(x)
于 2013-07-31T22:16:56.473 に答える