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 :

Extraction digit d'un nombre


Sujet :

Mathématiques

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Points : 104
    Points
    104
    Par défaut Extraction digit d'un nombre
    Bonjour, alors j'ai un problème pour un algorithme d'extraction.

    J'ai un nombre ex : 2008, et je dois extraire tous les digits de ce nombre ( 4 digits).

    Alors je ne vois pas comment procéder?
    J'ai une petite idée, c'est de transformer le tous en chaine de caractéres, mais je ne vois pas comment procéder ?

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    bonjour,

    tu veux bien décomposer ton nombre, par exemple 2008 => 2 0 0 8.
    Si c'est bien le cas, ton nombre est écrit en base décimale (10).
    Il faut donc le diviser succéssivement par des puissances de 10 et tu gardes à chaque fois la partie entière. Sans oublié d'enlever la partie que tu viens de trouver :

    2008 / 1000 => 2 && 2008 - 2*1000 = 8
    8 / 100 => 0 && 8 - 0*100 = 8
    8 / 10 => 0 && 8 - 0*10 = 8
    8 / 1 => 8

    Si tu souhaites savoir à partir de quel chiffre commencer, tu peux faire la même chose en sens inverse.

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    petite précision concernant la puissance par laquelle il faut commencer pour diviser.
    Il me semble que le log en base 10 d'un nombre décimal donne le nombre de digit, par exemple : log10(2008) = 4.

    Que quelqu'un me corrige si c'est faux.

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Il me semble que le log en base 10 d'un nombre décimal donne le nombre de digit, par exemple : log10(2008) = 4.
    Disons plutôt la 'partie entière' du log10 augmentée d'une unité.
    En théorie, c'est vrai puisque :
    log(x^n)=nlog(x) quelque soit la base
    et log10(10)=1 par définition.
    Cependant !...
    log, comme beaucoup d'autres fonctions usuelles, exp, les trigos, etc.. est une fonction transcendante (disons pour simplifier beaucoup plus compliquée à calculer qu'un polynôme). Alors il y a des risques pour des valeurs très grandes, proches d'une puissance de 10 (999999999-1000000001) à cause des arrondis.
    Si j'ai le temps je vais essayer de faire un test de 'plantage' en C.
    A mon avis, pour déterminer le nombre de chiffres, il vaut mieux faire un petite boucle avec des divisions entières plutôt que d'appeler une fonction complexe de la bibliothèque.
    Voilà, ce programme se trompe d'une unité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
     
    int main()
    {
        printf("%d\n",(int) log10((double)999999999999999)+1);
        return 0;
    }

  5. #5
    Membre actif
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Points : 284
    Points
    284
    Par défaut
    Plutôt que calculer un log, il suffit de parcourir le nombre dans l'autre sens, jusqu'à ce qu'il soit nul :
    2008 / 10 -> 200, reste 8
    200 / 10 -> 20, reste 0
    20 / 10 -> 2, reste 0
    2 / 10 -> 0, reste 2
    0 -> c'est fini.

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    oui, remonter dans l'autre sens était ma première intuition.

    Toutefois même si c'est une méthode extrêmement rapide, je pense que l'utilisation du log est tout de même beaucoup plus professionnelle et rafinée

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    je pense que l'utilisation du log est tout de même beaucoup plus professionnelle et rafinée
    Non, à mon avis c'est tout le contraire...
    Appeler une fonction extrêmement complexe de la bibliothèque pour calculer quelque chose de très simple, ce n'est pas professionnel du tout. Pour l'efficacité, il faudrait voir le cout réel dune invocation du log10. Sur ce plan encore je ne suis pas sûr qu'on soit gagnant, avec en prime le risque de se tromper.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Toutefois même si c'est une méthode extrêmement rapide, je pense que l'utilisation du log est tout de même beaucoup plus professionnelle et rafinée
    Le top du professionnel et rafiné reste quand meme le récursif (dixit jedai)

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int decompose(int n , int[] array) {
    	int length=0;
    	if (n>=10) length+=decompose(n/10,array);
    	array[length]=n%10;
    	return length+1;
    }
     
    int[] array =  new int[10];
    int length=decompose(2008,array);
    System.out.println(length);                 // ----> 4
    System.out.println(Arrays.toString(array)); // ----> [2,0,0,8,0,0,0,0,0,0]

  9. #9
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Oulà, c'est mignon comme programme !!!

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par ToTo13 Voir le message
    Oulà, c'est mignon comme programme !!!
    C'est clair... très lisible en plus.

    PS: c'est peut etre plus lisible comme ca ?
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int decompose(int n , int[] array) {
    	if (n==0) return 0;
    	int length=decompose(n/10,array);
    	array[length]=n%10;
    	return length+1;
    }

    PS2: en fait: non.

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Que donne
    ?

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Que donne
    ?
    Ca dépend avec quelle implémentation...
    avec la 1ere: return=1 et array=[0,0,0,0,0,0,0,0,0,0]
    avec la 2nde: retrun=0 et array=[0,0,0,0,0,0,0,0,0,0]

    après c'est une question de choix philosophique: combien de doigts faut-il pour compter jusqu'a zéro ?

  13. #13
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut !

    Avec ce bon vieux Fortran, ringard et honni de la plupart des informaticiens, c'est trivial:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          Implicit None
          Integer Nombre,Chiffres(4),k
          Character*4 Chaine
    C
          Nombre= ...
          Write (Chaine,'(I4)') Nombre
          Do k=1,4
            Read (Chaine(k:k),'(I1)') Chiffre(k)
          End Do
    Jean-Marc Blanc

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 264
    Points : 104
    Points
    104
    Par défaut
    Alors voila ma solus en java qui marche nikel .....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public int b =1;
    		public int l = 0;
    	public int nombreDigit(long nb){
     
     
     
    		while (b != 0){
    			b = (int) nb /10 ;
    			l++;
    			nb = b ;
    		}
     
    		return l ; 
    	}
    Merci à tous pour vos conseils ...... Parcontre la récursivité j'oublie trop compliqué pour rien loool

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/11/2009, 20h28
  2. Augmenter le nombre de digits d'un nombre
    Par deubelte dans le forum C++
    Réponses: 3
    Dernier message: 28/11/2008, 10h34
  3. extraction nombre from chaine caractere
    Par Matmal11 dans le forum Modules
    Réponses: 4
    Dernier message: 22/01/2007, 13h59
  4. [RegEx] Extraction d'un mot et d'un nombre dans
    Par lodan dans le forum Langage
    Réponses: 9
    Dernier message: 20/09/2006, 21h23
  5. [C++.NET] Extraction de nombres depuis une TextBox
    Par KaeRZed dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 19/04/2006, 13h57

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