Compter le nombre de chiffres dans un nombre

Fermé
Utilisateur anonyme - 20 oct. 2018 à 12:37
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 22 oct. 2018 à 13:06
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

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
20 oct. 2018 à 13:09
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://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees
2
Utilisateur anonyme
20 oct. 2018 à 13:18
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...
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > Utilisateur anonyme
20 oct. 2018 à 13:23
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.
0
Utilisateur anonyme
20 oct. 2018 à 13:33
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");
}
0
yg_be Messages postés 23313 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 8 novembre 2024 Ambassadeur 1 552
20 oct. 2018 à 12:46
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) 
0
Utilisateur anonyme
20 oct. 2018 à 13:11
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)
0
aure2015 Messages postés 93 Date d'inscription dimanche 11 janvier 2009 Statut Membre Dernière intervention 30 mai 2020 5
Modifié le 20 oct. 2018 à 17:12
Salut!

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

Bonne chance!
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
20 oct. 2018 à 16:47
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.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
20 oct. 2018 à 17:50
"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 π...
0
Utilisateur anonyme
22 oct. 2018 à 12:26
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...)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 22 oct. 2018 à 12:16
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
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 22 oct. 2018 à 13:07
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.
0