Compter le nombre de chiffres dans un nombre
Utilisateur anonyme
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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 !
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 !
A voir également:
- Compter le nombre de chiffres dans un nombre
- Nombre de jours entre deux dates excel - Guide
- Nombre facile - Télécharger - Outils professionnels
- Afficher le 0 devant un nombre dans excel - Guide
- Créer un compte google - Guide
- Nombre de page - Guide
5 réponses
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
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
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
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
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)
Salut!
Aucune classe d'entier n'acceptera 100 chiffres!
Par contre, tu peux utiliser les double qui accepteront peut-être!
Bonne chance!
Aucune classe d'entier n'acceptera 100 chiffres!
Par contre, tu peux utiliser les double qui accepteront peut-être!
Bonne chance!
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
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 longqui 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.
"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 π...
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 π...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :
En supposant qu'un utilisateur tape un nombre de 9 chiffres,
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
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
Dal
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,
scanfva 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
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...
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");
}