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

Mathématiques Discussion :

Récupérer tous les chiffres d'un nombre


Sujet :

Mathématiques

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut Récupérer tous les chiffres d'un nombre
    Ca doit être très simple, mais je n'arrive pas à trouver une meilleure solution que celle dont je développerais l'idée ci dessous.

    Énoncé du problème :

    1. On part du principe que tous les entiers seront forcément positifs (ce n'est pas vrai mais ca simplifiera l'ex, et les négatifs ne sont pas un souci).
    2. La plage possible d'un entier se situe entre 0 et ( (2^31) - 1 ) == 2147483647 .
    3. Pour différentes raisons propres au langage que j'utilise, et que vous n'avez pas besoin de connaitre, je préférerais éviter la solution de la conversion de l'entier en chaine de caractère.
    4. Les entiers sont exprimés en base 10, décimale.
    5. Je dois récupérer successivement les entiers qui composent le nombre, du poids le plus faible au plus élevé, ou inversement bien que je préférerais le premier ordre de défilement.


    Ex :5483152 , donnera 2,5,1,3,8,4,5

    Connaissant la plage possible d'un entier je peux diviser l'entier par une puissance de 10 décroissante, en partant de 10^9 jusqu'à ce que le quotient soit supérieur à 0, je peux ensuite déterminer facilement le chiffre du poids le plus élevé, jusqu'au poids le plus faible.

    Problème :
    Si mon nombre n'est pas supérieur à 99 999 999, on effectue une/des division(s) et itération(s) de boucle inutile(s).

    En rédigeant ce message je me suis rendu compte que je peux utiliser un switch.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if I < 10 then
    ...
    elseif I < 100 then
    ...
    ...
    endif
    Dans l'éventualité où vous auriez une meilleure solution à me proposer je reste ouvert à toute proposition, et le cas échéant je ne supprimerais pas ce message que j'ai mis tant de cœur à rédiger

    PS : Oui dans mon exemple je récupères les entiers du poids le plus fort au poids le plus faible, mais c'est juste parce que je ne voie pas d'autre solution directe

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Une première idée comme ça, qui me passe par la tête, le modulo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    i = 147852369;
    i%10 => 9
    i = (i - 9)/10 => 14785236;
    i%10 => 6 
    i = (i - 6)/10 => 1478523;
    
    ...
    
    
    i = (i - 4)/10 => 1;
    i%10 => 1
    i = (i - 1)/10 => 0;
    i==0 => STOP ALGO

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Une méthode "simple" à mettre en place :

    La plupart des langages propose des fonctionnalités de conversion Entier -> Chaines de caractère (par exemple Integer.toString en java, utiliser les ostringstream en C++ http://cpp.developpez.com/faq/cpp/?pa ge=strings#STRINGS_numtostr )

    Donc du coup, une fois fait la conversion, c'est simple de récuperer chaque chiffre.

    Sinon, la méthode de raptor marche très bien et à l'avantage d'être plus rapide.

    Implémentation de l'algo de raptor :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    		int monnombre = 134567;
    		while(monnombre!=0) {
    			int mod = monnombre%10;
    			System.out.println(mod);
    			monnombre-=mod;
    			monnombre/=10;
    		}

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 77
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Par défaut
    monnombre-=mod;
    Je pense que cette ligne est inutile avec l'arithmétique entière.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 172
    Par défaut
    Effectivement je n'avais pas pensé au modulo, merci.

  6. #6
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    le processeur implémente la division entière / modulo avec une seul instruction
    il faut donc de préférence mettre

    r = n%10
    n /= 10

    à la suite pour que le compilo puisse optimiser

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 959
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 959
    Par défaut
    Neo,
    Citation Envoyé par acx01b Voir le message
    le processeur implémente la division entière / modulo avec une seul instruction
    il faut donc de préférence mettre

    r = n%10
    n /= 10

    à la suite pour que le compilo puisse optimiser
    Sans oublier que rien ne garantit que cette optimisation souhaitable sera faite.

    Mais bon, c'est une transcription qui ne sera pas appelée des millions de fois...

  8. #8
    Membre éclairé
    Avatar de Wachter
    Homme Profil pro
    Développeur
    Inscrit en
    Octobre 2008
    Messages
    404
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 404
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    i = 147852369;
    i%10 => 9
    i = (i - 9)/10 => 14785236;
    i%10 => 6 
    i = (i - 6)/10 => 1478523;
    
    ...
    
    
    i = (i - 4)/10 => 1;
    i%10 => 1
    i = (i - 1)/10 => 0;
    i==0 => STOP ALGO
    Je pense qu'on peut se passer de soustraire à chaque fois le reste de la division de i par 10, ce qui est, à mon avis, inutile. J'écrirais plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    i = 147852369;
    i%10 => 9
    i =  i /10 => 14785236;
    i%10 => 6 
    i = (i /10 => 1478523;
    
    ...
    
    
    i = i / 10 => 1;
    i%10 => 1
    i = i /10 => 0;
    i==0 => STOP ALGO
    --
    Wachter

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

Discussions similaires

  1. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 02h37
  2. Parcourir un répertoire et récupérer tous les fichiers
    Par Sniper94-2 dans le forum Windows
    Réponses: 6
    Dernier message: 08/09/2005, 02h23
  3. Récupérer tous les champs de même nom
    Par hlr dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/02/2005, 14h26
  4. Réponses: 7
    Dernier message: 08/01/2005, 14h24
  5. [Plugin] Récupérer tous les fichiers *.java d'un workspace
    Par Satch dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 02/06/2004, 13h51

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