Compter le nombre de chiffres dans un nombre [Fermé]

Signaler
Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019
-
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
-
bonjour bonjour !

je viens ici demander de l'aide car je sèche sur un problème qui peut paraitre simple auquel je pensais avoir trouvé une solution seulement voilà... il refuse de compter pour des nombres qui sont trop grands !

mon code :

#include <stdio.h>

int compteur(b)
{
int c = 0;

while (b > 0)
{
b = b/10;
c++;
}
return c;
}


int main (int argc, char * argv[])
{
int a, b, c = 0;

scanf("%d", &a);

b = a;

c = compteur(b)



printf("%d\n%d\n", a, b); //pour verifier


printf("%d", c);
}


je ne vois vraiment pas pourquoi il ne fonctionne pas quand les nombres sont trop grands alors qu'après quelques recherches sur internet j'ai l'impression que ce même type de programme fonctionne bien chez les autres...

merci de bien vouloir m'aider !

5 réponses

Messages postés
16301
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 avril 2021
2 817
Bonjour,

Tous les types de données sont limitées en taille, donc si ton nombre est trop grand il ne peut pas être représenté avec un int, tu peux essayer avec d'autres types de données, mais tu seras toujours limité à un moment.

Voir les limites dans https://www.commentcamarche.net/contents/121-langage-c-les-types-de-donnees
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019
9
ah en effet le problème doit venir de là ^^
ca risque de compliquer le travail ! je dois compter pour des nombres pouvant comporter jusqu'à 100 chiffres !

pour résumer rapidement je souhaite ranger chaque chiffre du nombre dans une "case" d'un tableau donc je commence par chercher la taille que devra faire ce tableau... là je dois bien avouer que je n'ai aucune idée de comment faire...
Messages postés
16301
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 avril 2021
2 817 >
Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019

Au lieu de lire un nombre (
int
,
long
), tu pourrais lire une chaîne de caractères (
char[]
), la taille de ton nombre sera tout simplement la taille du tableau de caractères correspondant.
Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019
9
ah... malheureusement notre prof ne veut pas qu'on utilise les chaines de caractères mais je me disais que je n'étais peut être pas obligé de connaître la "taille" du nombre pour en ranger les chiffres dans un tableau. si je crée un tableau avec une taille de 100 mais qu'il n'est pas rempli entièrement je pourrai ne lire que le nombre case par case et créer une "balise" qui ferai arrêter la lecture du tableau

exemple :

for (i=0, i<100, i++)
{
if (tableau[i] == 'a') // 'a' sera la balise
{
break;
}
else tableau[i] = (il faut que je trouve un moyen de "casser le nombre en chiffres");
}
Messages postés
15017
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
9 avril 2021
827
bonjour, "il refuse": coup de poing, message d'erreur, résultat incorrect?
peux-tu partager ce que le programme affiche pour a, b, et c, ainsi que ce que tu souhaites qu'il affiche?
en passant: je pense plus propre de spécifier le type du paramètre b dans
int compteur(b) 
Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019
9
merci de ta réponse si rapide !
non le coup de poing il ne sait pas faire (heureusement haha) par contre le résultat est incorrect :

lorsque a = 123
il me revoie les valeurs suivantes :
a = 123
b = 0
c = 3


tout va bien !


mais si a = 12345678901

alors on a:
a = -539222987
b = -539222987
c = 0

(aie)
Messages postés
93
Date d'inscription
dimanche 11 janvier 2009
Statut
Membre
Dernière intervention
30 mai 2020
4
Salut!

Aucune classe d'entier n'acceptera 100 chiffres!
Par contre, tu peux utiliser les double qui accepteront peut-être!

Bonne chance!
Messages postés
540
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
8 avril 2021
69
Bonjour,

Si on compte l'ensemble des particules de l'Univers on a besoin d'un nombre d'environ 80 chiffres. A quoi peut bien servir un nombre de 100 chiffres?

En C, le plus grand des types permettant de stocker tous les chiffres d'un nombre est le type
unsigned long long
qui atteint 2^64-1 c'est à dire un nombre ridicule 18446744073709551615 qui ne fait que 20 chiffres. Pour aller au delà il faut faire appel à une bibliothèque pour les grands nombres, ça m'étonnerais que le prof s'attende à l'utilisation d'une bibliothèque externe.
Messages postés
16301
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
7 avril 2021
2 817
"A quoi peut bien servir un nombre de 100 chiffres?"
En cryptographie par exemple, on manipule des nombres de plusieurs centaines de chiffres.
Exemple : une clé RSA à 2048 bits (taille recommandée par l'ANSII) représente un nombre de 600 chiffres.

Remarque : depuis 2016 on connaît 22 459 157 718 361 chiffres pour π...
Messages postés
78
Date d'inscription
mercredi 24 août 2016
Statut
Membre
Dernière intervention
13 mars 2019
9
le prof veut nous faire faire des calculs sur des grands chiffres (je suis débutant en C) par le biais de tableau dans lesquels on appliquerai la méthode manuelle (ex : pour additionner il faut faire la somme des unités, la somme des dizaines, etc...)
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
Bonjour Titoufou89,

ah... malheureusement notre prof ne veut pas qu'on utilise les chaines de caractères

Je suppose que cela veut dire que non seulement tu ne peux pas lire une ligne avec fgets, mais que tu ne peux pas non plus utiliser scanf avec %s.

Ensuite, tu parles de "nombres" et de "chiffres", sans préciser si tu dois ou non traiter les nombres décimaux, mais en revanche ton code concerne des nombres entiers.

Donc, bien que tu ne donnes pas entièrement les éléments de ton problème, il semblerait que tu doives obligatoirement utiliser scanf avec %d (ou un autre spécificateur entier) et pouvoir compter le nombre de chiffres tapés en supportant jusqu'à 100 chiffres.

Tu as trouvé une méthode pour compter le nombre de chiffres.

Il te reste à savoir comment faire pour saucissonner ta lecture en plusieurs fois pour tenir compte des limitations des types entiers standard.

Pour cela, il te suffit d'utiliser un spécificateur de taille avec scanf et de répéter la lecture ainsi limitée tant qu'il y a des données dans le flux stdin et que l'on est dans les limites des 100 chiffres maximum à gérer.

http://www.cplusplus.com/reference/cstdio/scanf/

Par exemple :

int nombre1;
scanf("%5d", &nombre1);

En supposant qu'un utilisateur tape un nombre de 9 chiffres,
scanf
va consommer 5 caractères dans stdin et interpréter le résultat en le stockant en tant qu'entier dans
nombre1
. Si tu répètes
scanf("%5d", &nombre2);
, le programme consommera (jusqu'à) 5 caractères suivants disponibles dans stdin en tant qu'entier dans
nombre2
, etc.

La difficulté est ensuite de savoir quand s'arrêter de lire stdin. Pour cela, il faut savoir s'il reste quelque chose dans stdin à "consommer". Je te laisse rechercher cette partie :-)

Note que les limites de nombres pouvant être représentés en tant qu'entiers pour un compilateur C donné sont accessibles dans l'entête
<limits.h>


http://www.cplusplus.com/reference/climits/

et que tu devrais sans doutes utiliser cette information (pas celle qui est en colonne de droite, qui est la valeur minimale à supporter selon le standard, mais celle indiquée par
<limits.h>
) pour dimensionner correctement tes blocs d'entiers à récupérer.

Dal
Messages postés
5491
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
2 avril 2021
932
note aussi que ta fonction
compteur
devrait avoir un prototype
int compteur(int b)
et qu'elle ne compte correctement que le nombre de chiffres de nombres entiers positifs et non nuls.