Подсчет цифр с использованием цикла while
недавно я делал программу, которая должна была проверить количество цифр в числе, введенном пользователем. В результате я сделал следующий код:
int x;
cout << "Enter a number: ";
cin >> x;
x /= 10;
while(x > 0)
{
count++;
x = x/10;
}
насколько я могу судить (даже с моим ограниченным опытом), что кажется сырой и довольно unelegant.
есть ли у кого-нибудь идея о том, как улучшить этот код (не используя встроенную функцию c++)?
7 ответов
в вашем конкретном примере вы можете прочитать число как строку и подсчитать количество символов.
но в общем случае вы можете сделать это по-своему или использовать логарифм base-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;
}
вы можете прочитать пользовательский ввод как строку, а затем подсчитать символы? (После дезинфицировать и уравновешивать, etc.)
кроме того, вы можете получить библиотеку, чтобы выполнить тяжелую работу за вас; преобразовать значение обратно в строку, а затем подсчитать символы:
cin >> x;
stringstream ss;
ss << x;
int len = ss.str().length();
Если x
является целым числом, и по "встроенной функции" вы не исключаете логарифмы, то вы могли бы сделать
double doub_x=double(x);
double digits=log(abs(doub_x))/log(10.0);
int digits= int(num_digits);
учитывая очень конвейерный процессор с условными ходами, этот пример может быть быстрее:
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 итераций.
#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;
}
Bar предложения чтения числа в виде строки, ваш текущий метод подсчета количества значимых десятичных цифр в порядке. Вы могли бы сделать его короче, но это может быть, возможно, менее ясно (дополнительный набор скобок добавлен, чтобы удержать gcc от выдачи предупреждений):
while((x = x/10))
count++;