Exercice: boucles imbriquées

Fermé
Saylekk Messages postés 1 Date d'inscription mercredi 30 novembre 2022 Statut Membre Dernière intervention 30 novembre 2022 - Modifié le 30 nov. 2022 à 15:26
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 30 nov. 2022 à 15:41

Bonjour tout le monde, cela fait 4 heures que je bloque sur un exercice concernant les boucles imbriquées. Avez vous une idée pour m'aider ?

def nombre_premiers(n):
    resultat = ''
    compteur_div = 0
    for inferieur in range(n):
        inferieur > 1
        for diviseur in range(1, inferieur + 1):
            compteur_div += 1
            if compteur_div == 2:
                resultat += str(inferieur)
    return resultat

Modération : merci de partager ton code comme expliqué ici

1 réponse

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 30 nov. 2022 à 15:51

Bonjour,

Par rapport à ton message

Merci de partager ton code comme expliqué ici

Par rapport au code proposé

Il y a de nombreuses choses qui ne vont pas :

  • l2 : tu crées une chaîne de caractère pour préparer le résultat, or ce type est inadapté. Il vaudrait mieux utiliser une liste
  • l4-5 : si le but est de démarrer à inferieur = 1, tu devrais simplement écrire for inferieur in range(1, n)
  • l5 : cette ligne ne sert à rien car tu ne fais rien du résultat de ce test.
  • ton programme ne teste pas si diviseur est un diviseur de inferieur.

Par rapport au problème posé

Tu devrais peut être par écrire sur le papier ce que ton programme doit faire pour :

  1. tester si d est un diviseur de n
  2. lister les diviseurs de n
  3. tester si n est premier

Chacun de ces trois points peut correspondre à une fonction. Une fonction écrite, tu peux la réutiliser pour construire les fonctions restantes. Une fois cette étape préliminaire claire dans ta tête, passe au code.

En découpant le problème ainsi, ce sera plus lisible, plus facile à écrire, et tu n'auras pas besoin de faire des boucles imbriquées. Tu pourras toujours tout rassembler dans une même fonction a posteriori si tu veux vraiment le faire avec des boucles imbriquées.

Voici à quoi pourrait ressembler cette étape préliminaire

  1. L'opération n % d retourne le reste de la division euclidienne de n par d. Donc si n % d == 0, alors d divise n.
  2. Pour lister les diviseurs de n, il suffit d'itérer sur les valeurs allant de 1 à math.sqrt(n). Si le test précédent est vrai, on ajoute d à la liste des résultats.
  3. Pour tester si n est premier
    • Si n == 0 ou n == 1
      • On renvoie False.
    • Si n >= 2, il suffit de chercher ses diviseurs.
      • Dès qu'on en trouve plus que 2, on sait que n n'est pas premier et on renvoie False.
      • Si on en a trouvé que deux (1 et n), alors n est premier et on renvoie True.

Pour t'aider à démarrer voici comment traduire en python les deux premières fonctionnalités :

import math

def est_divisible(n: int, d: int) -> bool:
    return n % d == 0

def diviseurs(n: int) -> iter:
    return (
        d
        for d in range(1, n + 1)
        if est_divisible(n, d)
    )

def est_premier(n: int) -> bool:
    # CODE A COMPLETER
    return True

l = list(diviseurs(10))
print(l)                # Affiche [1, 2, 5, 10]
print(est_premier(10))  # Doit afficher False une fois le code complété
print(est_premier(7))   # Doit afficher True une fois le code complété

Bonne chance

0