Подсчет цифр с использованием цикла while - PullRequest
7 голосов
/ 06 июля 2011

Я недавно делал программу, которая должна была проверять количество цифр в числе, введенном пользователем. В результате я сделал следующий код:

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

Из того, что я могу сказать (даже с моим ограниченным опытом), можно сказать, что это кажется грубым и довольно нелегким.

У кого-нибудь есть идеи по улучшению этого кода (без использования встроенной функции c ++)?

Ответы [ 7 ]

12 голосов
/ 06 июля 2011

В вашем конкретном примере вы можете прочитать число в виде строки и подсчитать количество символов.

Но в общем случае вы можете сделать это по-своему или использовать логарифм с основанием-10.

Вот пример логарифма:

#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;
}
5 голосов
/ 06 июля 2011
int count = (x == 0) ? 1 : (int)(std::log10(std::abs((double)(x)))))) + 1;
2 голосов
/ 06 июля 2011

Вы можете прочитать пользовательский ввод как строку, а затем посчитать символы?(После очистки и обрезки и т. Д.)

Кроме того, вы можете получить библиотеку, которая сделает за вас тяжелую работу;преобразовать значение обратно в строку, а затем подсчитать символы:

cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
1 голос
/ 07 июля 2011

Учитывая очень конвейерный процессор с условными перемещениями, этот пример может быть быстрее:

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; }

, так как он полностью развернут. Хороший компилятор может также развернуть цикл while максимум до 10 итераций.

1 голос
/ 06 июля 2011

Если x является целым числом, и "встроенной функцией" вы не исключаете логарифмы, тогда вы можете сделать

double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
0 голосов
/ 09 октября 2013
#include<iostream>
using namespace std;
int main()
{
int count=0;
    double x;
    cout << "Enter a number: ";
    cin >> x;
    x /= 10;
    while(x > 1)
    {
      count++;
      x = x/10;
    }
    cout<<count+1;
}
0 голосов
/ 06 июля 2011

Запретить предложения о чтении числа в виде строки, ваш текущий метод подсчета количества значащих десятичных цифр в порядке. Вы могли бы сделать его короче, но это, возможно, могло бы быть менее понятно (добавлен дополнительный набор скобок, чтобы не дать gcc выдавать предупреждения):

while((x = x/10))
  count++;
...