7 votes

Compter les chiffres à l'aide de la boucle while

J'ai récemment créé un programme qui devait vérifier le nombre de chiffres d'un nombre entré par l'utilisateur. En conséquence, j'ai créé le code suivant :

int x;    
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
  count++;
  x = x/10;
}

D'après ce que je peux dire (même avec mon expérience limitée), cela semble grossier et plutôt inélégant.

Quelqu'un a-t-il une idée sur la façon d'améliorer ce code (tout en n'utilisant pas une fonction c++ intégrée) ?

12voto

Zan Lynx Points 23100

Dans votre exemple particulier, vous pourriez lire le nombre sous forme de chaîne et compter le nombre de caractères.

Mais pour le cas général, vous pouvez le faire à votre façon ou vous pouvez utiliser un logarithme en base 10.

Voici l'exemple du logarithme :

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    double n;
    cout << "Enter a number: ";
    cin >> n;

    cout << "Log 10 is " << log10(n) << endl;
    cout << "Digits are " << ceil(log10(fabs(n)+1)) << endl;
    return 0;
}

5voto

David Hammen Points 17912
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;

2voto

Oli Charlesworth Points 148744

Vous pourriez lire l'entrée de l'utilisateur comme une chaîne de caractères, et ensuite compter les caractères ? (Après nettoyage, découpage, etc.)

Vous pouvez également demander à une bibliothèque de faire le travail à votre place, en convertissant la valeur en une chaîne de caractères, puis en comptant les caractères :

cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();

1voto

Dan Points 3429

Si x est un entier, et par "fonction intégrée" vous n'excluez pas les logarithmes, alors vous pourriez faire

double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);

1voto

dascandy Points 2818

Avec un processeur très pipeliné et des déplacements conditionnels, cet exemple peut être plus rapide :

if (x > 100000000) { x /= 100000000; count += 8; }
if (x > 10000) { x /= 10000; count += 4; }
if (x > 100) { x /= 100; count += 2; }
if (x > 10) { x /= 10; count += 1; }

car il est entièrement déroulé. Un bon compilateur peut également dérouler la boucle while jusqu'à un maximum de 10 itérations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X