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 :

Somme des chiffres d'un nombre


Sujet :

Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Somme des chiffres d'un nombre
    Bonjour,

    J'essaye de calculer la somme des chiffres d'un nombre. Par exemple, pour le nombre 123, on aurait : 1+2+3 = 6.
    J'ai réalisé un petit programme python qui fait cela très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nombre = 123
    reste = 0
    while nombre != 0:
        reste += nombre%10
        nombre = nombre-(nombre%10)
        nombre = nombre//10
    print(reste)
    Cependant, je veux que mon nombre ne possède qu'un seul chiffre à la fin de l'opération. Par exemple, pour le nombre 48, mon programme n'est pas adapté et affiche 12, au lieu de 3. 48 donne 8+4 = 12 qui donne 1+2 = 3. J'avais tenté de rajouter le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if reste >= 10:
       nombre = reste
    mais j'obtenais une boucle sans fin

    Merci pour votre aide.

  2. #2
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    tu as une approche très mathématique. Je n'ai pas vérifié.

    "Chaque chiffre d'un nombre" ça peut être une itération sur la représentation "texte"du nombre (une chaine c'est un itérable, caractère par caractère, quitte à repasser dans les entiers le moment venu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> nombre = 123
    >>> sum([ int(c) for c in str(nombre) ])
    6
    >>> nombre = 48
    >>> sum([ int(c) for c in str(nombre) ])
    12
    est une solution


    Ooops : je n'ai pas lu jusqu'au bout. Je m'y replonge. 12 n'est pas un résultat attendu. Faudrait 3
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #3
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    alors ...

    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
    16
    17
    18
    19
    20
    >>> result = 48
    >>> while len(str(result)) != 1:
    ...     result = sum([ int(c) for c in str(result) ])
    ... 
    >>> 
    >>> result
    3
    >>> 
    >>> result = 1234567
    >>> while len(str(result)) != 1:
    ...     result = sum([ int(c) for c in str(result) ])
    ... 
    >>> result
    1
    >>> 1+2+3+4+5+6+7
    28
    >>> 2+8
    10
    >>> 1+0
    1
    ça colle ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    vite fait, sûrement simplifiable.

    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
    16
    def foo(div):
     
        while True:
            acc = 0
            while div:
                div,mod = divmod(div,10)
                acc += mod
            if acc >= 10:
                div = acc
                continue
            break
        return acc
     
    somme = foo(48)
    print(somme)
    >>> 3

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    une version moche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foo = lambda x: x if x < 10 else foo(eval(str(x).replace('','+').strip('+')))
    foo(48)
    >>> 3

  6. #6
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par Nooby300 Voir le message
    Cependant, je veux que mon nombre ne possède qu'un seul chiffre à la fin de l'opération. Par exemple, pour le nombre 48, mon programme n'est pas adapté et affiche 12, au lieu de 3. 48 donne 8+4 = 12 qui donne 1+2 = 3.
    Bonsoir,
    Pour rester plus dans l'esprit du code originel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    nb = 48
    som = 0
    while nb:
        som += nb%10
        nb //=10
        if som>9:
            som = som//10 + som%10
    print(som)
    Clodion

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    @clodion
    joliiiiii ! et tellement évident que je me sens idiot.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par josmiley Voir le message
    @clodion
    joliiiiii !
    Bonsoir,
    Merci!
    Mais je ne connaissais pas la fonction "divmod"…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nb = 1234567
    som = 0
    while nb:
        nb, s = divmod(nb, 10)
        som = sum(divmod(som+s, 10))
    print(som)
    Clodion

    PS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    nb = 48
    while nb>9:
        nb = sum(divmod(nb, 10))
    print(nb)

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    EXCELLENT !
    Bien que je ne comprenne pas pourquoi ça marche.

  10. #10
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par josmiley Voir le message
    Bien que je ne comprenne pas pourquoi ça marche.
    Bonsoir,

    pour 1234567
    -> on ajoute 7 à 6 (13)
    -> il y a une retenue: elle est reportée sur le 5 (123463: le 13 apparaît bien).
    -> au lieu d'avoir 13 puis plus tard 13 + 5 on a le 3 qui est en place et la retenue qui se reporte directement sur le 5 (la somme est automatiquement réduite).
    -> pour 5, 6, 7 : avec deux variables on a 7 + 6 = 13 puis 1 + 3 = 4 puis 5 + 4 = 9. Ici avec une variable on fait 56 + 7 =63 puis 6 + 3!!
    -> au lieu d'être sommée au 3, la retenue est additionnée au 5.
    => aucun chiffre n'est "perdu", ils sont tous additionnés!!

    Bon, ce n'est sans doutes pas très clair, mais cela se voit bien avec papier et crayon!!
    Clodion

  11. #11
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Je persiste à penser qu'une approche purement mathématique (et pourtant, de par ma formation, mon activité de tous les jours) n'est pas très pythonique ici.

    Un peu comme si c'était un complexe d'informaticien "pur" voulant se donner un semblant "de reconnaissance scientifique". Y a pas besoin ! Une approche purement informatique est [EDIT]PARFOIS[/EDIT] un réel plus ! Pourquoi complexer ?

    [edit] bref, passer par des modulos, etc... ça fait plus "mathématique" . Mais ce n'est pas, de mon point de vue, très pythonique
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  12. #12
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Avril 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2015
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci pour toutes vos réponses. C'est toujours agréable de voir qu'il y a toujours plusieurs approches et solutions pour résoudre un problème De mon côté j'ai compris pourquoi j'obtenais une boucle sans fin. C'est parce que je ne réinitialisais pas la variable reste à 0. La variable reste correspond en fait à la somme des chiffres. Clodion avait choisit un nom de variable plus explicite. Le programme devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nombre = 48
    reste = 0
    while nombre != 0:
        reste += nombre%10
        nombre = nombre//10
        if reste >= 10:
            nombre = reste
            reste = 0
    print(reste)
    Variante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    nombre = 48
    while nombre >= 10:
          reste = 0
          while nombre != 0:
             reste = reste + nombre % 10
             nombre = nombre // 10
          nombre = reste
    print(reste)

  13. #13
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Je persiste à penser qu'une approche purement mathématique (et pourtant, de par ma formation, mon activité de tous les jours) n'est pas très pythonique ici.

    Un peu comme si c'était un complexe d'informaticien "pur" voulant se donner un semblant "de reconnaissance scientifique". Y a pas besoin ! Une approche purement informatique est [EDIT]PARFOIS[/EDIT] un réel plus ! Pourquoi complexer ?
    Bonjour,
    Pourquoi une telle attaque?

    Citation Envoyé par plxpy Voir le message
    [edit] bref, passer par des modulos, etc... ça fait plus "mathématique" . Mais ce n'est pas, de mon point de vue, très pythonique
    Idem…

    @Nooby300: Le premier code ne me semble pas fonctionner (il efface la variable "nombre")
    Je pense qu'il manque le petit "+" (ligne 7):
    Clodion

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    @Clodion
    je n'ai toujours pas compris pourquoi A//10+A%10 donne toujours un nombre qui répond au problème(et ça m'énerve).
    j'ai donc essayé de prendre le problème à l'envers et je me suis rappelé de la propriété de la table de 9. J'en suis arrivé à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> fonction = lambda nombre: nombre%9
    >>> fonction(48)
    3
    >>> fonction(578)
    2
    >>>
    tout simplement.

  15. #15
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par josmiley Voir le message
    j'ai donc essayé de prendre le problème à l'envers et je me suis rappelé de la propriété de la table de 9.
    Bonjour,
    Là c'est vraiment bien vu!!! Chapeau bas.
    Super bravo

    Clodion

  16. #16
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    merci, mais en fait ça fonctionne pas avec les multiples de 9.
    petite correction en ajoutant une condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> fonction = lambda nombre: nombre%9 or 9 if nombre else 0
    >>> fonction(48)
    3
    >>> fonction(578)
    2
    >>> fonction(99)
    9
    >>> fonction(0)
    0
    du coup c'est moins glamour.

  17. #17
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    plus court ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fonction = lambda x: x and (x%9 or 9)

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2012, 00h18
  2. Calcul de somme des chiffres de nombre 2^1000
    Par mouradj2006 dans le forum Mathématiques
    Réponses: 12
    Dernier message: 27/02/2012, 11h45
  3. Fonction de calcul de somme des chiffres d'un entier
    Par sam343 dans le forum Langage
    Réponses: 3
    Dernier message: 07/10/2009, 17h35
  4. template XSL qui calcule la somme des chiffres d'un nombre
    Par thierry_b dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/04/2009, 14h55
  5. Réponses: 6
    Dernier message: 01/02/2009, 00h14

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