IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Programmation décomposition en produits de facteurs premiers d'un seul nombre [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Septembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 18
    Par défaut Programmation décomposition en produits de facteurs premiers d'un seul nombre
    Salut

    si je ne suis pas au bon endroit, veuillez me pardonner et me faire suivre, merci les amis

    Voilà, je passe du monde C++ à Python et c'est la galère

    Lors d'un travail en groupe, il nous a été demandé la chose suivante:
    On nous demande de respecter ceci dans l'ordre:
    1. Entrer un nombre entier
    2. Si ce nombre est négatif, afficher un message d'erreur et recommencer le programme
    3. Sinon, si ce nombre est 0, le programme termine.
    4. Autrement, afficher la décomposition en produit de facteurs premiers du nombre:

    voici ce que j'ai fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    n=int(input("Entrez un nombre entier:"))
    if n<0:
        print("n est négatif, erreur, recommencez")
    elif n==0:
        print("n est nul, Fin du programme")
    else:
        print("n est positif, Poursuivez")

    le seul hic, c'est le côté recommencer, en ligne 2, comment faire ?



    Suite de l'énoncé
    On trouve le plus petit diviseur du nombre, en commençant par 2 ;
    a- Afficher ce diviseur à l’écran
    b- Diviser le nombre par ce diviseur, et recommencer les deux dernières étapes avec ce nombre (plus petit)
    c- Éventuellement ce processus devra s’arrêter (à moi de trouver quand, voir ci-dessous)

    5. Une fois la liste affichée (donc tous les diviseurs), recommencer le programme avec un nouveau nombre


    la suite, et là, c'est la galère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    d=int(input("Entrez le plus petit diviseur: 2"))
    n=n/d
    print(n,"n/d= ",n/d)
    if n=(2,3,5,7,11,13):
        n/d=1
     
    return0;
    voici ce que je veux, via un exemple

    le nombre (n): 20
    le diviseur le plus petit (d) :2

    20/2 = 10

    je reprend le 10 et je le divise par 2
    10/2 = 5

    5 n'est divisible que par lui-même donc
    5/5 = 1

    en somme n=n/d => 10=20/2 => 5=10/2 => 5/5=1
    je fais commencer pour écrire cela en python

    ensuite, je ne veux conserver que les nombre entier, donc comment ne retenir que les résultats n/d entiers (int) et ne pas conserver les float (décimales)

    comment demander à Python de faire 2, puis essayer 3, 4, 5, .... et les afficher

    au final, et cela j'arrive uniquement à le faire sous forme mathématique, c'est d.'écrire le résultat final : 20 = 2*2*5

    une fois cela fait, je veux aussi recommencer le programme (genre voulez vous recomm3encer) au départ en choisissant un nouveau nombre : j'ai pensé à return; mais ça ne marche pas

    j'ai Python: 3.4

    Vraiment besoin d'aide



  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Intrepid13 Voir le message
    Voilà, je passe du monde C++ à Python et c'est la galère
    C'est la galère parce que tu n'as pas pris la peine d'apprendre un petit peu plus Python (Python est plus facile que C++).

    Lecture recommandée: le livre de Gérard Swinnen qu'on peut télécharger ici: http://python.developpez.com/cours/apprendre-python3/

    Autre chose: quand tu donnes un code dans tes messages, il faut l'entourer par les tags de code (le '#' en haut et à droite de la fenêtre d'édition). Sinon, les indentations disparaissent, ce qui rend ton code illisible et inutilisable. Attention aux indentations: ils matérialisent des blocs de code, et ils ont la même signification que le "{...}" de C++.


    Ceci étant:

    Voilà ton 1er code corrigé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while True:
        n=int(input("Entrez un nombre entier:"))
        if n<0:
            print("n est négatif, erreur, recommencez")
        elif n==0:
            print("n est nul, Fin du programme")
            break # sortie de la boucle while
        else:
            print("n est positif, Poursuivez")
            # ...
            # suite du programme 
            # ...
    Le principe est simple: "while True" est toujours vrai, et donc boucle indéfiniment. On sort de la boucle avec "break" lorsque n==0.


    Pour ton 2ème code:

    on teste si n est divisible par d avec n%d==0 (car n%d est le reste de la division entière de n par d)

    on obtient le résultat (entier) de la division entière de n par d avec: n//d

    Dans ton algorithme, on arrête les divisions quand n==1 puisque 2 est le plus petit nb premier.

    On aura donc 2 boucles while pour l'algorithme: l'une pour arrêter le calcul quand n==1 et l'autre pour essayer tous les diviseurs à partir de 2.

    Voilà un petit code qui fait ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    d = 2
    while n>1:
        while n%d==0:
            n = n//d
            print("facteur trouvé:", d)
        d += 1
    Ce qui affichera pour n=100:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    facteur trouvé: 2
    facteur trouvé: 2
    facteur trouvé: 5
    facteur trouvé: 5
    Il faut tout de même reconnaitre que cet algorithme est très "rustique", et conduit à faire des tas de calculs inutiles. Mais il donne les bons résultats tout en restant très simple.
    Améliorations possibles:
    - à part d=2, on ne devrait tester que les nombres impairs.
    - pour les premiers diviseurs, on pourrait tester une liste de nombre premiers ([2,3,5,7,11,...])
    - on devrait arrêter le calcul lorsque d>racine du n initial

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Intrepid13 Voir le message
    Voilà, je passe du monde C++ à Python et c'est la galère
    ...
    le seul hic, c'est le côté recommencer, en ligne 2, comment faire ?
    ...
    comment demander à Python de faire 2, puis essayer 3, 4, 5, .... et les afficher
    ...
    une fois cela fait, je veux aussi recommencer le programme (genre voulez vous recomm3encer) au départ en choisissant un nouveau nombre : j'ai pensé à return; mais ça ne marche pas
    Bonjour

    Si tu arrivais à faire ça en C++ je ne comprends pas pourquoi tu n'y arrives pas en Python vu que pour ce travail précis, les syntaxes sont (quasiment) les mêmes. A mon avis, c'est plutôt un pb d'algo que tu as. Surtout vu la petite remarque à propos du <return> qui, aussi bien en C++ qu'en Python, a exactement la même signification qui n'est certainement pas de retourner "quelque part" mais de retourner "quelque chose" !!!
    C'est pourquoi tu devrais t'intéresser à la partie algo du forum...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Septembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 18
    Par défaut Programmation python suite
    Salut
    un gros merci pour les informations et conseils

    donc, pour la seconde partie, je veux:
    tant que d=2 divise n et que le résultat soit un entier, on continue avec d=2.
    si le résultat est décimal, on passe à d=3, et ainsi de suite jusqu'à ce que n/d=1
    une fois n/d=1, arrêter les calculs, écrire la décomposition finale: n=d1*d1*d2*d3*...
    et proposer de recommencer le programme en choisissant un nouveau nombre entier


    Ah j'oubliais, le prof nous fait lire le livre de G Swinnen, mais il n'a lu que les 4 premiers chapitres, donc la fonction "break" pas encore vue, comment la remplacer !
    merci

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Intrepid13 Voir le message
    Ah j'oubliais, le prof nous fait lire le livre de G Swinnen, mais il n'a lu que les 4 premiers chapitres, donc la fonction "break" pas encore vue, comment la remplacer !
    Voilà un code complet sans le break:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    n = 1 # n'importe quelle valeur sauf 0
    while n!=0:
        n=int(input("Entrez un nombre entier:"))
        if n<0:
            print("n est négatif, erreur, recommencez")
        elif n>0:
            print("n est positif, suite du programme")
            d = 2
            while n>1:
                while n%d==0:
                    n = n//d
                    print("facteur trouvé:", d)
                d += 1
        print()    
    print("Fin du programme")

  6. #6
    Membre actif
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Septembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 18
    Par défaut Programmation python suite
    salut
    un gros gros merci, je vois mes erreurs et je els comprends maintenant
    effectivement c++ et python se ressemblent pas mal

    enfin, dernière question

    Je souhaite qu'une fois les facteurs trouvés, soit écrit la décomposition, n=d1*d1*d2*d3*...
    Quelle est l'instruction

    Enfin, une fois cela fait, demander de recommencer le programme en choisissant un nouveau nombre entier

    merci

  7. #7
    Membre actif
    Femme Profil pro
    Auditeur informatique
    Inscrit en
    Septembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 18
    Par défaut Programmation python suite
    [code:]retry = int(input("Voulez vous recommencer (oui=1, non=2) :"))
    if retry == "2":

    print( "Bye bye" ) [code:]

    j'ai essayé mais ça marche pas
    des idées

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Décomposition en facteurs premiers
    Par Invité dans le forum Mathématiques
    Réponses: 7
    Dernier message: 23/04/2012, 23h39
  2. Réponses: 1
    Dernier message: 08/04/2009, 12h17
  3. Décomposition en facteurs premiers
    Par Girl24 dans le forum Fortran
    Réponses: 6
    Dernier message: 18/11/2008, 13h08
  4. Décomposition d'entier en produit de facteurs
    Par shangai3 dans le forum Pascal
    Réponses: 7
    Dernier message: 30/06/2007, 17h57
  5. Décomposition en facteurs premiers
    Par méphistopheles dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 07/11/2005, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo