Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ex. nombres premiers

Sujet résolu
    24 septembre 2014 à 16:47:21

    Bonjour,

    On commence la programmation en python et après 3h de cours, on a comme exercice celui-ci: "Ecrivez un script qui affiche les 100 premiers nombres premiers. "

    En soit j'ai réussi à coder un script qui donne les nombres premiers qui est celui-ci:

    listeNbre = []
    maxListe = int(input("Choisissez la limite de la liste: "))
    

    for x in range(2, maxListe +1):

    listeNbre.append(x)
    

    print("Voici la liste complete de nombre:") print(listeNbre)

    nombre = 2

    while nombre **2 <= maxListe:

    for x in listeNbre:
        if (x % nombre) == 0:
            if x == nombre:
                continue
            else:
                listeNbre.remove(x)
    nombre += 1
    

    print("Voici la liste des nbres premiers compris entre 2 et", maxListe, ":") print(listeNbre)

    </pre>

    Il est pas très beau je sais mais voila je m’entraîne encore :-° Dans ce script je demande à l'utilisateur de rentrer la limite de la liste. Cela me permet de s'avoir l'intervalle entre laquelle le programme doit donner les nombres premiers. Donc vous l'aurez compris il peut donner plus comme moins de 100 nombres premiers et c'est ce que je voudrais changer. Vu comme je dois me limiter aux 100 premiers nombres premiers, je ne sais pas comment modifier mon code... :euh:

    En espérant que quelqu'un pourra me donner des indices pour résoudre ce désagrément :) Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2014 à 17:04:00

      Il suffit de faire un while dont le prédicat serait len(liste) < 100, normalement ça devrait marcher.

      Sinon listeNbre ne présente pas d'intérêt, et pourquoi passer par un while pour tester si un nombre est premier alors que le for est plus adapté (pour i allant de 2 à racine de n, avec un pas de deux pour optimiser, si n%2 == 0 blabla...). Et ensuite si tu veux la liste des cent premiers nombres premiers, tu fait le while ;)

      • Partager sur Facebook
      • Partager sur Twitter
        24 septembre 2014 à 19:07:39

        Je vois vraiment pas où placer la while dont tu parles :euh:

        • Partager sur Facebook
        • Partager sur Twitter
          24 septembre 2014 à 19:20:02

          Salut,

          Ton code n'est pas si mauvais (surtout après seulement 3H). On se rapproche d'ailleurs d'une solution très efficace, voir même peut-être plus efficace (à confirmer par d'autres) que celle que j'ai vue (à savoir garder la taille de la liste constante et remplacer les nombres non premier par 0). La seule chose qu'il faut faire c'est de remplacer ta boucle while par une autre boucle for.

          Le principe du code est simple: Tu vas avoir 2 boucle for. La première boucle va prendre un nombre de ta liste, qu'on appellera i. La seconde boucle va regarder si les nombres de ta liste, qu'on appellera j, sont divisibles par i (en écartant le cas de i diviser par lui-même). Si c'est le cas, tu supprime les nombres j de ta liste.

          Voici ton petit code modifié:

          maxListe = int(input("Choisissez la limite de la liste: "))
          
          #On met le contenu de range dans une liste. C'est l'équivalent de tes lignes 1, 
          #4 et 5 en plus rapide
          listeNbre = list(range(1, maxListe+1))
          
          #Nos 2 boucles (tu vois que la majorité de ton code a été conservée)
          for i in listeNbre:
              #On prend un nombre i
          
              #Tous les nombres sont divisible par 1, donc on le prend pas en compte
              if i == 1:
                  continue
              for j in listeNbre:
                  #Et on le compare à tous les nombres de la liste
                  #Si les nombres sont divisibles par i
                  if j%i == 0:
                      #On regarde si c'est le même nombre
                      if j == i:
                          continue
                      #Si ce n'est pas le cas, on supprime le nombre de la liste
                      else:
                          listeNbre.remove(j)
          
          print("Voici la liste des nbres premiers compris entre 2 et", maxListe, ":")
          print(listeNbre)

          -
          Edité par Olygrim 24 septembre 2014 à 20:22:32

          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
            24 septembre 2014 à 19:37:34

            Et si maintenant je n'ai envie qu'il me ressort que les 100 premiers nombres premiers de l'intervalles je fais comment? Par rapport à la question plus haut, je me demande donc si c'est possible de couper une liste en 2 c'est à dire, les 100 premiers termes et le reste?

            • Partager sur Facebook
            • Partager sur Twitter
              24 septembre 2014 à 19:37:41

              Je voyais plutot un truc de ce genre là: 

              def is_prime(n):
                  if n == 1:
                      return False
                  if n == 2:
                      return True
                  elif n % 2 == 0:
                      return False
                  else:
                      for i in range(3, int(n**0.5) + 1, 2):
                          if n % i == 0:
                              return False
                      return True
              
              def find_first_primes(n):
                  L = []
                  i = 2
                  while len(L) < n:
                      if is_prime(i):
                          L.append(i)
                      i += 1
                  return L



              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2014 à 19:48:23

                "Et si maintenant je n'ai envie qu'il me ressort que les 100 premiers nombres premiers de l'intervalles"

                Gardons à l'esprit que si maxListe = 100, tu n'aura pas 100 nombres premiers.

                Maintenant si l'utilisateur entre un énorme nombre, et que tu ne veux lui afficher que les 100 premiers, tu peux utiliser le slicing:

                #Si la taille de la liste est supérieure à 100
                if len(listeNbre) > 100:
                    #listeNbre[:100] équivaut à listeNbre[0:100]
                    #qui équivaut au 100 premiers éléments de la liste
                    listeNbre = listeNbre[:100]
                
                print("Voici la liste des 100 premiers nbres premiers compris entre 2 et", maxListe, ":")
                print(listeNbre)


                -
                Edité par Olygrim 24 septembre 2014 à 20:22:46

                • Partager sur Facebook
                • Partager sur Twitter
                Précepte: Le mieux est l'ennemi du bien
                  24 septembre 2014 à 19:57:54

                  Ou sinon tu ne fait pas de calculs inutiles et calcule juste la liste des 100 premiers nombres premiers :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 septembre 2014 à 20:20:37

                    Oui mais il faudrait voir comment faire car la liste est pleine au début, donc supérieur à 100. Et c'est au fur et à mesure qu'on retire des éléments. Il faudrait peut-être créer une liste secondaire pour enregistrer les nombres premiers, mais ça serait vraiment dommage.

                    Le plus simple, serait de limiter maxListe. En testant avec quelques nombres, j'ai vu que si la valeur max est 500 on a 96 nombres premiers, et pour 600 on en a 110. Donc a toi de limiter maxListe:

                    maxListe = int(input("Choisissez la limite de la liste: "))
                    
                    if maxListe > 600:
                        maxListe = 600



                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                      24 septembre 2014 à 20:33:59

                      Je compte aussi le faire dans un autre script . Je m’entraîne comme j'ai dit :-°

                      Sinon merci pour vos réponses :)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Ex. nombres premiers

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown