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

Télécharger C Discussion :

Comment calculer le nombre de chiffres d'un entier ? [Sources]


Sujet :

Télécharger C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut Comment calculer le nombre de chiffres d'un entier ?
    Bonjour, Je vous propose un nouvel élément à utiliser : Comment calculer le nombre de chiffres d'un entier ?



    Il peut être parfois utile de connaître le nombre de chiffres que contient un nombre par exemple si l'on souhaite le convertir en chaîne de caractères à l'aide de la fonction sprintf.



    Qu'en pensez-vous ?

  2. #2
    Membre actif
    Homme Profil pro
    Intégrateur Web
    Inscrit en
    Mars 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Intégrateur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 9
    Par défaut Hello !
    int MyInt = 2012;
    int NumberOfDigits = String.valueOf(MyInt).length();
    //that should return 4

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 547
    Par défaut
    Citation Envoyé par shessuky Voir le message
    int MyInt = 2012;
    int NumberOfDigits = String.valueOf(MyInt).length();
    //that should return 4
    Formidable.

    • Ce que tu nous proposes n'est pas du C ;
    • Comment fonctionne « valueOf » ;
    • Comment t'y prendrais-tu si c'était à toi de l'écrire (pour que les autres puissent l'utiliser) ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    C'est du Java ça


    EDIT : en regardant la source proposé, je me dis qu'il y a des propriétés de la fonction LOG que ne connait pas encore... Pourtant, j'en ai bouffé des maths pendant mes études

    EDIT 2: http://forums.futura-sciences.com/ma...ssion-2-n.html Je me passerai un week-end en étant plus intelligent.

  5. #5
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Comment fonctionne « valueOf »
    Lis le man...

    C'est pas sur un ton agressif que je dis cela, c'est juste que l'exemple proposé utilise aussi une fonction externe log10 (même si dans ce cas c'est du c standard).

    Autres pistes : http://graphics.stanford.edu/~seande...erLog10Obvious

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 547
    Par défaut
    Citation Envoyé par valefor Voir le message
    c'est juste que l'exemple proposé utilise aussi une fonction externe log10 (même si dans ce cas c'est du c standard).
    Relis bien mon commentaire également, sans agressivité non plus. J'ai bien dit « comment fonctionne » valueOf(). Pas « comment utilise-t-on ».

    C'est pas tant le fait que l'exemple utilise une fonction externe qui me gène. Ce qui m'ennuie, c'est qu'outre le fait que le code Java soit hors-sujet dans cette section, il génère directement la chaîne qui représente le nombre pour la mesurer ensuite. Or, l'un des principaux (et rares) cas où une telle fonction serait utile, c'est justement pour connaître à l'avance la place qu'il prend pour pouvoir allouer un tableau de caractères en conséquence, qui puisse le recevoir.

    C'est aussi révélateur du fait que beaucoup de programmeurs aujourd'hui apprennent à calculer avec des objets sans avoir la notion de coût en ressources ni de la marche à suivre pour les implémenter.

  7. #7
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Bonjour,
    par curiosité j'ai testé la fonction fournie qui semble ne fonctionner que pour les nombres positifs, à cause des propriétés du logarithme ?

    Du coup, un peu hors-sujet et toujours par curiosité, je me demandais ce que vous pensiez de cette fonction que j'ai pondue pour répondre au problème sans la lib math. D'après vous, est-ce qu'elle couvre tous les cas d'utilisation d'entiers (dans l'intervalle du type défini) et est-ce qu'elle serait optimisable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int nombre_chiffre2(int i)	{
    	int c = 0;
     
    	if(i < 0)	{
    		 i = -i;
    	}
     
    	do	{
    		c++;
    	}
    	while((i /= 10) > 0);
    	return c;
    }
    Merci d'avance.

  8. #8
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,
    par curiosité j'ai testé la fonction fournie qui semble ne fonctionner que pour les nombres positifs, à cause des propriétés du logarithme ?

    Du coup, un peu hors-sujet et toujours par curiosité, je me demandais ce que vous pensiez de cette fonction que j'ai pondue pour répondre au problème sans la lib math. D'après vous, est-ce qu'elle couvre tous les cas d'utilisation d'entiers (dans l'intervalle du type défini) et est-ce qu'elle serait optimisable ?
    Après avoir testé sur de nombreuses valeurs, force est de constater que cette fonction marche sur l'intervalle [-INT_MAX ; INT_MAX].
    Bon, c'est pas la première fois qu'on voit cette fonction sur le Web, mais elle remplit son boulot.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et j'ajouteraais qu'elle va beaucoup plus vite que la fonction intitiale :

    calculer un log est long (développemeny de Taylor), utilise des doubles, alors qu'on a besoin que d'arithmétique entière, et sans log

    Mais on peut l'optimiser sans fair de division :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do	{
    		c++;
    	}
    	while((i /= 10) > 0);
    peut devenir, à base d'un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int tab[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000...} ;
    int *p = tab ;
     
    do	{
    		c++;
    	}
    	while(*(p+c) < i);
    le plus optimal...

  10. #10
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Merci pour vos réponses.
    Pas mal, le coup du tableau

  11. #11
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Une variante qui permet d'avoir un temps de calcul plus rapide sur les grands nombres (limités dans ce code à i <10^16 si le unsigned int le supporte naturellement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int nombre_chiffre2(unsigned int i)
    {
     int c = 1;
     if(i>=100000000) { c += 8; i/= 100000000;}
     if(i>=10000) { c += 4; i/= 10000;}
     if(i>=100){ c += 2; i/= 100;}
     if(i>=10)c +=1;
     return c;
    }
    il y a de toute façon 5 tests et le nombre d'additions et de divisions pour un nombre à N chiffres (décimaux) dépend du nombre de 1 dans la représentation binaire de N-1
    Par exemple, un nombre à 10 chiffres demandera
    5 tests + (1 addition +1 division) + 1 addition

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene Voir le message
    Une variante qui permet d'avoir un temps de calcul plus rapide sur les grands nombres (limités dans ce code à i <10^16 si le unsigned int le supporte naturellement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int nombre_chiffre2(unsigned int i)
    {
     int c = 1;
     if(i>=100000000) { c += 8; i/= 100000000;}
     if(i>=10000) { c += 4; i/= 10000;}
     if(i>=100){ c += 2; i/= 100;}
     if(i>=10)c +=1;
     return c;
    }
    il y a de toute façon 5 tests et le nombre d'additions et de divisions pour un nombre à N chiffres (décimaux) dépend du nombre de 1 dans la représentation binaire de N-1
    Par exemple, un nombre à 10 chiffres demandera
    5 tests + (1 addition +1 division) + 1 addition
    Avec ton idée, on doit pouvoir utiliser une dichotomie pour optimser les seuils, et utiliser des else, ce qui évite des tests.

    Mais vu que sur un 32 bits le max est 10 chiffres, donc un tableau de 10, mais que même si on double, c'est encore très acceptable, on peut utiliser le tableau sans aucune division. (10 (ou 20) (addition+test) max)

Discussions similaires

  1. Comment limiter le nombre de chiffre après la virgule ?
    Par Hoopsy dans le forum C++Builder
    Réponses: 15
    Dernier message: 06/07/2007, 17h12
  2. Comment fixer le nombre de chiffre après la virgule d'un flottant
    Par moon93 dans le forum Général Python
    Réponses: 1
    Dernier message: 15/06/2007, 17h49
  3. Comment imposer un nombre de chiffre après la virgule
    Par Yagami_Raito dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 11h24
  4. Réponses: 1
    Dernier message: 11/12/2006, 13h45
  5. Réponses: 2
    Dernier message: 06/08/2006, 01h08

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