Найти длину числа
Длина числа – это количество цифр в его записи. У числа 5 длина равна 1, у 407 – 3, у 1 000 000 – 7. Задача встречается в математике, олимпиадных заданиях и программировании (валидация ввода, форматирование, алгоритмы).
Ниже – три способа найти длину числа: математическая формула, цикл деления и преобразование в строку.
Формула: как найти длину числа через логарифм
Для любого целого числа n ≠ 0 количество цифр вычисляется по формуле:
L = floor(log₁₀(|n|)) + 1
Где:
- log₁₀ – десятичный логарифм
- |n| – модуль числа (без знака)
- floor – округление вниз до целого
Для n = 0 длина равна 1 (особый случай, так как log₁₀(0) не определён).
Примеры расчёта
| Число | n | log₁₀( | n | ) | floor | +1 | Длина | ||
|---|---|---|---|---|---|---|---|---|---|
| 7 | 7 | 0,845 | 0 | 1 | 1 | ||||
| 42 | 42 | 1,623 | 1 | 2 | 2 | ||||
| −385 | 385 | 2,586 | 2 | 3 | 3 | ||||
| 1 000 | 1 000 | 3,000 | 3 | 4 | 4 | ||||
| 99 999 | 99 999 | 4,9999 | 4 | 5 | 5 |
Формула работает для любой системы счисления – достаточно заменить основание логарифма. Для двоичной записи: floor(log₂(|n|)) + 1.
Как определить количество цифр в числе без логарифма
Если логарифмы недоступны (младшие классы, ограничения задачи), подходит цикл деления на 10.
Алгоритм:
- Взять модуль числа
- Установить счётчик = 0
- Пока число > 0: разделить нацело на 10, увеличить счётчик на 1
- Если исходное число = 0, вернуть 1
Пример для числа 4 028:
- 4 028 ÷ 10 = 402 → счётчик 1
- 402 ÷ 10 = 40 → счётчик 2
- 40 ÷ 10 = 4 → счётчик 3
- 4 ÷ 10 = 0 → счётчик 4
Результат: 4 цифры.
Как найти длину числа в Python, JavaScript и C++
Python
def length_str(n):
return len(str(abs(n)))
import math
def length_log(n):
if n == 0:
return 1
return math.floor(math.log10(abs(n))) + 1
def length_loop(n):
n = abs(n)
if n == 0:
return 1
count = 0
while n > 0:
n //= 10
count += 1
return count
JavaScript
// Через строку
const lengthStr = (n) => Math.abs(n).toString().length;
// Через логарифм
const lengthLog = (n) => (n === 0 ? 1 : Math.floor(Math.log10(Math.abs(n))) + 1);
C++
#include <cmath>
int numberLength(long long n) {
if (n == 0) return 1;
if (n < 0) n = -n;
return static_cast<int>(std::floor(std::log10(n))) + 1;
}
Какой способ выбрать
| Критерий | Логарифм | Цикл деления | Строка |
|---|---|---|---|
| Сложность | O(1) | O(d) | O(d) |
| Точность для очень больших чисел | Возможны ошибки округления float | Точный | Точный |
| Простота кода | Средняя | Простая | Самая простая |
| Работа без библиотек | Нужен math | Да | Да |
d – количество цифр в числе.
Для чисел до 15–17 цифр (диапазон double/float64) логарифм работает корректно. Для произвольно больших целых (например, BigInt в JavaScript или длинная арифметика в Python) безопаснее использовать строковый метод или цикл.
Частные случаи
- Отрицательные числа – перед вычислением берите модуль. Знак не считается цифрой.
- Дробные числа – стандартная формула применяется к целой части. Если нужно общее число цифр, переведите в строку и уберите разделитель.
- Числа с ведущими нулями – в математике ведущие нули не учитываются (007 = 7, длина 1). В строковом представлении они могут сохраняться – зависит от задачи.
- Степени десятки – граничный случай для формулы: log₁₀(1 000) = 3,000, floor(3,000) = 3, +1 = 4. Всё корректно.