Как узнать длину числа без использования строк?
Например, на вход в функцию поступает число 12345. Результатом будет 5. Даже если число отрицательное, например, -1234567, то результатом будет 7.
Ответы (7 шт):
Для работы с log10 и abs необходимо подключить библиотеку math.h (Для типа int работает корректно)
int lenNum(int value)
{
return (value != 0) ? (int)(log10(abs(value))) + 1 : 1;
}
Если же входные данные типа long или long long, то лучше обойтись обычным же стопудовым вариантом - через циклы. (Выше коллеги представили множество подобных решений).
int lenNumLL(long long value)
{
int len = 0;
do
{
value /= 10;
len++;
} while (value);
return len;
}
int length(int n) {
if (n == 0) return 1;
int l = 0;
while(n) {
l++;
n /= 10;
}
return l;
}
Или так:
int length(int n) {
int l = 1;
for(; n/=10; ++l);
return l;
}
int length(int n) {
int l = 0;
do {
l++;
n /= 10;
} while(n);
return l;
}
Еще есть варианты:
size_t foo1(const int n)
{ return std::to_string(n).size() - size_t(n < 0); }
size_t foo2(const int n)
{
std::ostringstream out;
out << n;
return out.str().size() - size_t(n < 0);
}
//...
Но лучше с делением на основание.
Перевожу свой комментарий в ответ:
int n = 42;
int len = std::snprintf(nullptr, 0, "%d", n) - (n < 0);
Логарифм по основанию 10 возьмет наименьшее целое значение, к нему прибавляем 1, и готово.
Варианты, предложенные местными знатоками, крайне огорчают. Так что вот простой способ всем бедолагам на будущее:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int a;
cin>>a;
int b = log10(fabs(a))+1;
Для тридцати двух бит есть такое решение. На больших числах оно раза в три быстрее цикла с делением на десять:
int len(int n) {
int l = 1;
{ int k = n / 100000000; if (k != 0) { l += 8; n = k; } }
{ int k = n / 10000 ; if (k != 0) { l += 4; n = k; } }
{ int k = n / 100 ; if (k != 0) { l += 2; n = k; } }
{ int k = n / 10 ; if (k != 0) { l += 1; n = k; } }
return l;
}