1
votes

Impression de nombres premiers dans la plage

k=int(input())
res=[2]
for i in range(2,k+1):
    if i%2==0:
       continue 
    else:
      for j in range(2,i):
          if i%j==0 or j%2==0 :
              break
      else:
             res.append(i)
print(res)
This code is for finding prime numbers in a given range of numbers.
I tried to run the code but the list is having only number 2. Can anyone tell me what is happening?
If I remove j%2==0 it's working. I just want to know my mistake.

1 commentaires

Eh bien j commencera toujours par 2. Et vous dites si j% 2 == 0 alors casser. puisque j commencera toujours par 2, cette condition sera toujours vraie puisque 2% 2 sera toujours 0. donc vous appellerez toujours break j n'incrémentera jamais plus de 2


3 Réponses :


0
votes

dans votre boucle interne, la variable j commence à partir de la valeur 2, puis vous avez une instruction if qui est toujours True car j% 2 == 0 code> est toujours 2% 2 == 0 qui est toujours True , donc vous coupez toujours de la première étape du intérieur pour itération de boucle

vous pouvez utiliser:

# Sieve of Eratosthenes
# Code by David Eppstein, UC Irvine, 28 Feb 2002
# http://code.activestate.com/recipes/117119/

def _gen_primes():
    """ Generate an infinite sequence of prime numbers.
    """
    # Maps composites to primes witnessing their compositeness.
    # This is memory efficient, as the sieve is not "run forward"
    # indefinitely, but only as long as required by the current
    # number being tested.
    #
    D = {}

    # The running integer that's checked for primeness
    q = 2

    while True:
        if q not in D:
            # q is a new prime.
            # Yield it and mark its first multiple that isn't
            # already marked in previous iterations
            # 
            yield q
            D[q * q] = [q]
        else:
            # q is composite. D[q] is the list of primes that
            # divide it. Since we've reached q, we no longer
            # need it in the map, but we'll mark the next 
            # multiples of its witnesses to prepare for larger
            # numbers
            # 
            for p in D[q]:
                D.setdefault(p + q, []).append(p)
            del D[q]

        q += 1

k=int(input())

def gen_primes(k):
    gp = _gen_primes()

    p = next(gp)
    while p < k:
        yield p
        p = next(gp)

res = list(gen_primes(k))

sortie:

[2, 3, 5, 7, 11, 13, 17, 19]

pour une génération prime efficace, vous pouvez utiliser le tamis d'Eratosthène:

import math 

k=int(input())
res=[]
for i in range(2, k+1):
    for x in range(2, int(math.sqrt(i) + 1)):
        if i % x == 0 :
            break
    else:
        res.append(i)
# k = 20


0 commentaires

0
votes

Votre code a eu un problème, dans la boucle interne la condition ou est incorrecte, comme souligné par @kederrac. Vous n'avez pas besoin du j% 2 == 0 car j commence toujours par 2 et i% j == 0 couvre déjà la condition

k=int(input())
res=[2]
for i in range(2,k+1):
    if i%2==0:
       continue 
    else:
      for j in range(2,i):
          if i%j==0 :
              break
      else:
             res.append(i)
print(res)


0 commentaires

1
votes

Vous devez utiliser votre résultat actuel pour accélérer votre processus. Vous n'avez besoin de tester la divisibilité que par nombres premiers. Mais vous construisez une liste de nombres premiers. Alors utilisez-le!

import math
k=int(input())
primes=[]
for i in range(2,k+1):
    j=math.sqrt(i)
    if all(i%p!=0 for p in primes if p<=j):
        primes.append(i)

Vous pouvez également vous améliorer en sélectionnant uniquement les éléments premiers qui sont inférieurs à sqrt (i) comme d'autres le suggèrent.

k=int(input())
primes=[]
for i in range(2,k+1):
    if all(i%p!=0 for p in primes):
        primes.append(i)

p>


0 commentaires