Comment calculer le nombre de chiffres d'un entier ?

Présentation
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.
Téléchargement
Compatibilité
Linux Mac Windows
0  0 
Téléchargé 49 fois Voir les 23 commentaires
Détails
Catégories : Algorithmes
Avatar de fearyourself
Expert éminent sénior
Voir tous les téléchargements de l'auteur
Licence : Autre
Date de mise en ligne : 30 novembre 2010




Avatar de shessuky shessuky - Membre à l'essai https://www.developpez.com
le 06/01/2012 à 10:53
int MyInt = 2012;
int NumberOfDigits = String.valueOf(MyInt).length();
//that should return 4
Avatar de Obsidian Obsidian - Responsable Modération https://www.developpez.com
le 06/01/2012 à 11:49
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) ?
Avatar de Bktero Bktero - Modérateur https://www.developpez.com
le 06/01/2012 à 13:49
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.
Avatar de valefor valefor - Membre éclairé https://www.developpez.com
le 06/01/2012 à 13:56
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
Avatar de Obsidian Obsidian - Responsable Modération https://www.developpez.com
le 06/01/2012 à 18:22
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.
Avatar de Djakisback Djakisback - Membre émérite https://www.developpez.com
le 07/01/2012 à 21:56
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
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.
Avatar de Kirilenko Kirilenko - Membre éclairé https://www.developpez.com
le 08/01/2012 à 9:45
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.
Avatar de souviron34 souviron34 - Expert éminent sénior https://www.developpez.com
le 08/01/2012 à 12:13
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
1
2
3
4
do	{ 
		c++; 
	} 
	while((i /= 10) > 0);
peut devenir, à base d'un tableau :

Code : Sélectionner tout
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...
Avatar de Djakisback Djakisback - Membre émérite https://www.developpez.com
le 08/01/2012 à 17:06
Merci pour vos réponses.
Pas mal, le coup du tableau
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Contacter le responsable de la rubrique C