Как узнать длину числа без использования строк?

Например, на вход в функцию поступает число 12345. Результатом будет 5. Даже если число отрицательное, например, -1234567, то результатом будет 7.


Ответы (7 шт):

Автор решения: Artyomka

Для работы с 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;
}
→ Ссылка
Автор решения: Mikhailo
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;
}
→ Ссылка
Автор решения: AR Hovsepyan

Еще есть варианты:

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);
}
//...

Но лучше с делением на основание.

→ Ссылка
Автор решения: HolyBlackCat

Перевожу свой комментарий в ответ:

int n = 42;
int len = std::snprintf(nullptr, 0, "%d", n) - (n < 0);
→ Ссылка
Автор решения: Sauron

Логарифм по основанию 10 возьмет наименьшее целое значение, к нему прибавляем 1, и готово.

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

#include <iostream>
#include <cmath>
using namespace std; 
int main() { 
    int a;
    cin>>a;
    int b = log10(fabs(a))+1;
→ Ссылка
Автор решения: Stanislav Volodarskiy

Для тридцати двух бит есть такое решение. На больших числах оно раза в три быстрее цикла с делением на десять:

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;
}
→ Ссылка