As shown by other answers, using log10
leads to incorrect results for large n
while using len(str(...))
or manual looping leads to slow performance for large n
. Jodag’s answer provides a really good alternative which only fails for integers that will likely crash your computer, but we can do a bit better and even faster (for n
small enough that math.log2
is guaranteed to be accurate) by avoid logarithms altogether and using binary instead:
def num_digits(n: int) -> int:
assert n > 0
i = int(0.30102999566398114 * (n.bit_length() - 1)) + 1
return (10 ** i <= n) + i
Let’s break this down. First, there’s the weird n.bit_length()
. This calculates the length in binary:
assert 4 == (0b1111).bit_length()
assert 8 == (0b1011_1000).bit_length()
assert 9 == (0b1_1011_1000).bit_length()
Unlike logarithms, this is both fast and precise for integers. As it turns out, this results in exactly floor(log2(n)) + 1
. In order to get the floor(log2(n))
on its own, we subtract 1
, hence the n.bit_length() - 1
.
Next, we multiply by 0.30102999566398114
. This is equivalent to log10(2)
slightly rounded down. This takes advantage of logarithmic rules in order to calculate an estimate of floor(log10(n))
from floor(log2(n))
.
Now, you might be wondering how off we might be at this point, because although 0.30102999566398114 * log2(n) ~ log10(n)
, the same is not true for floor(0.30102999566398114 * floor(log2(n))) ~ floor(log10(n))
. Recall that x - 1 < floor(x) <= x
so that we can do some quick math:
log2(n) - 1 < floor(log2(n)) <= log2(n)
log10(n) - 0.30102999566398114 < 0.30102999566398114 * floor(log2(n)) <= log10(n)
floor(log10(n) - 0.30102999566398114) < floor(0.30102999566398114 * floor(log2(n))) <= floor(log10(n))
Note then that floor(log10(n) - 0.30102999566398114)
is at least floor(log10(n)) - 1
, meaning we are at most 1
off from our result. This is where the final correction comes in, where we check 10 ** i <= n
, which results in an extra 1 +
when the result is too small or 0 +
when the result is just right.
Similar to Jodag’s answer, this approach actually fails for very very large n
, somewhere around 10 ** 2 ** 52
where i
is off by more than -1
. However, integers of that size will likely crash your computer, so this should suffice.
Описание задачи
Программа принимает число и выводит количество цифр в нем.
Решение задачи
- Берем значение целого числа и записываем его в переменную.
- Используем цикл
while
и при помощи оператора целочисленного деления «уничтожаем» каждую цифру числа начиная с последней, а при каждой итерации цикла специально созданную переменную (так называемый счетчик цикла) увеличиваем на единицу. После того как введенное в начале число станет равным 0, цикл прекратит свою работу. - Выводим значение этого счетчика на экран.
- Конец.
Исходный код
Ниже дан исходный код для подсчета количества цифр в данном числе. Результаты работы программы также даны ниже.
n = int(input("Введите число:")) count = 0 while(n > 0): count = count + 1 n = n // 10 print("Количество цифр равно:", count)
Объяснение работы программы
- Записываем введенное пользователем число в переменную
n
. - Задаем переменную
count
и инициируем ее значением 0. - Используем цикл
while
и при помощи оператора целочисленного деления «уничтожаем» каждую цифру числа начиная с конца. - При каждой итерации цикла переменная
count
увеличивается на 1. - Как только цифры в числе заканчиваются и число
n
становится равным 0, цикл прекращает свою работу. - Выводим переменную
count
на экран.
Результаты работы программы
Пример 1: Введите число:123 Количество цифр равно: 3 Пример 2: Введите число:1892 Количество цифр равно: 4
Примечание переводчика
Надо заметить, что опять эту задачу можно решить намного короче, если использовать методы строк.
print("Количество цифр равно:", len(input("Введите число:")))
Здесь введенное число принимается как строка и мы просто выводим ее длину.
На чтение 5 мин Просмотров 6.8к. Опубликовано
В этой статье мы рассмотрим, как посчитать количество цифр в числе на языке Python. Эта задача может быть полезна в различных областях программирования, например, для проверки корректности ввода данных, анализа числовых данных и многих других. Мы рассмотрим несколько способов решения этой задачи, начиная от наиболее простого и заканчивая более сложными и продвинутыми.
Содержание
- Способы подсчета цифр в числе
- Способ 1: Преобразование в строку и подсчет символов
- Способ 2: Использование цикла и операции целочисленного деления
- Способ 3: Использование рекурсии
- Способ 4: Использование математических функций
Способы подсчета цифр в числе
Подсчет количества цифр в числе является одной из базовых операций, которая может пригодиться в различных областях программирования. Существует несколько способов подсчета цифр в числе на языке Python, и каждый из них имеет свои преимущества и недостатки в зависимости от конкретной задачи.
Способ 1: Преобразование в строку и подсчет символов
Один из простейших способов подсчета цифр в числе в языке Python — это преобразовать число в строку и подсчитать количество символов в этой строке с помощью функции len()
. Для этого необходимо использовать встроенную функцию str()
для преобразования числа в строку. Затем с помощью функции len()
можно получить количество символов в этой строке, что будет равно количеству цифр в числе. Этот способ не требует использования дополнительных модулей или библиотек, поэтому он достаточно прост в реализации. Однако он не является самым эффективным способом подсчета цифр в больших числах.
Приведём простой пример:
num = 12345
num_str = str(num)
count = len(num_str)
print("Количество цифр в числе", num, ":", count)
В этом примере мы преобразуем число num
в строку num_str
с помощью встроенной функции str()
, а затем считаем количество символов в строке с помощью функции len()
. Результат выводится с помощью функции print()
.
Предположим, что нам необходимо запросить число у пользователя. И так как мы сразу получаем от пользователя сразу строку, то наш код преобразуется следующим образом:
num_str = input("Введите число:")
count = len(num_str)
print("Количество цифр в числе", num_str, ":", count)
Всё хорошо, но мы забыли про отрицательные числа. Если пользователь введёт отрицательное число, то наша программа посчитает знак минус как символ, и мы не получим правильный результат.
Поэтому нам нужно добавить вызов функции abs()
для преобразования отрицательного числа в положительное перед началом подсчета. И вот что у нас получится:
num_str = input("Введите число:")
num = abs(int(num_str))
count = len(str(num))
print("Количество цифр в числе", num_str, ":", count)
В первой строке кода мы получаем от пользователя число в виде строки. Во второй строке сначала преобразовываем строку в число, а после вызываем функцию abs()
. В третье строке считаем количество символов, не забыв при этом преобразовать число обратно в строку.
Способ 2: Использование цикла и операции целочисленного деления
Еще один способ подсчета количества цифр в числе — использование цикла и операции целочисленного деления. Этот метод заключается в том, чтобы повторять целочисленное деление числа на 10 до тех пор, пока оно не станет меньше 10. Каждый раз при целочисленном делении на 10 из числа удаляется одна цифра, и таким образом можно подсчитать количество цифр в числе. Этот подход основан на том факте, что при целочисленном делении числа на 10 результат будет равен числу, в котором отсутствует последняя цифра. Например, при целочисленном делении числа 123 на 10 получим 12.
В результате, чтобы использовать этот способ для подсчета количества цифр в числе, можно использовать цикл while, который будет продолжаться, пока число не станет меньше 10. При каждой итерации цикла мы будем целочисленно делить число на 10, увеличивать счетчик цифр на 1 и повторять цикл до тех пор, пока число не станет меньше 10. Когда число меньше 10, добавляем 1 к счетчику и выходим из цикла.
Например, если у нас есть число 12345, мы можем использовать этот метод для подсчета количества цифр в числе следующим образом:
number = 12345
count = 0
while number > 0:
count += 1
number = number // 10
print("Количество цифр в числе:", count)
Если нам необходимо чтобы программа работала и с отрицательными числами, то нам также нужно добавить вызов функции abs()
для преобразования отрицательного числа в положительное перед началом подсчета. Также добавим условие для 0, и получим следующий код:
num = -98765
count = 0
if num == 0:
count = 1
else:
num = abs(num)
while num > 0:
count += 1
num //= 10
print("Количество цифр в числе:", count)
Способ 3: Использование рекурсии
Для подсчета количества цифр в числе можно использовать рекурсию. Рекурсия — это метод, при котором функция вызывает саму себя. В данном случае функция принимает число и сравнивает его с нулем. Если число равно нулю, то функция возвращает 0. Если число не равно нулю, то функция вызывает саму себя, передавая число, целочисленно деленное на 10, и увеличивает счетчик на 1. Рекурсивный вызов функции продолжается, пока число не станет равным 0. Затем функция возвращает счетчик — количество цифр в числе.
Рекурсивная функция может быть очень эффективным решением в некоторых задачах, однако в некоторых случаях может вызывать проблемы, связанные с памятью, поскольку каждый новый вызов функции создает новый стек вызовов.
Пример рекурсивной функции для подсчета количества цифр в числе:
def count_digits(n):
n = abs(n) # преобразование отрицательного числа в положительное
if n < 10:
return 1
else:
return 1 + count_digits(n // 10)
Способ 4: Использование математических функций
Для подсчета количества цифр в числе можно использовать математические функции. Например, можно воспользоваться свойством логарифма, которое позволяет вычислить количество цифр в числе, используя десятичный логарифм. Для этого нужно взять логарифм числа по основанию 10 и добавить к результату 1. Полученное число и будет являться количеством цифр в исходном числе. Данный подход может оказаться полезным, когда требуется узнать количество цифр в очень больших числах, так как для работы с такими числами может потребоваться много времени и памяти.
Приведём пример:
import math
num = 12345
count = int(math.log10(num))+1
print("Количество цифр в числе", num, "равно", count)
В этом коде мы импортируем модуль math и используем функцию log10() для определения десятичного логарифма числа. Затем мы добавляем 1 к результату и приводим его к целочисленному типу, чтобы получить количество цифр в числе.
В этой статье мы разберем два способа посчитать, сколько цифр в числе. Первый способ предполагает использование целочисленного деления в цикле while. Второй – применение встроенных функций Python и преобразование числа в строку.
Считаем количество цифр в числе при помощи цикла while
Идея данного подхода состоит в том, чтобы удалять крайнюю правую цифру в числе до тех пор, пока число не станет равно 0.
Вот алгоритм этого метода:
- Получаем от пользователя число и записываем его в переменную
- Создаем переменную-счетчик и инициализируем ее значением 0
- При помощи цикла
while
удаляем крайнюю правую цифру (123 превращается в 12, потом в 1 и потом в 0) - При каждой итерации цикла увеличиваем значение счетчика на 1 и делаем это, пока исходное число не будет равно 0. В конечном итоге в переменной-счетчике будет содержаться значение, соответствующее количеству цифр в числе
- Выводим полученное значение в консоль
count = 0 number = int(input("Enter a number ")) while (number > 0): number = number // 10 count = count + 1 print("Total number of digits: ", count) # Результат: # Enter a number 155 # Total number of digits: 3
Объяснение алгоритма:
- Данный код полностью идентичен алгоритму, который мы привели выше.
count
— это переменная-счетчик, используемая для хранения общего количества цифр в числе. Она инициализируется в начале нулем. - Для ввода числа мы используем метод
input()
. Данный метод возвращает строку, поэтому мы оборачиваем его в методint()
, который преобразует ее в целое число. Оно сохраняется в переменнуюnumber
. - Цикл
while
будет выполняться до тех пор, пока значение переменнойnumber
больше нуля. - В теле цикла мы производим целочисленное деление числа, которое хранится в переменной number, на 10. И далее сохраняем в эту переменную новое число, полученное в результате такого деления. Если значение переменной было равно 123, то после целочисленного деления на 10 оно станет равно 12. Это полностью эквивалентно удалению крайней правой цифры числа.
- После этого мы увеличиваем значение счетчика (переменная
count
) на 1. В конце концов исходное число в переменнойnumber
станет равно 0 и цикл прекратит свою работу. - Выводим значение переменной count в консоль.
Считаем, сколько цифр в числе, преобразовав его в строку
Вместо использования цикла while
мы можем напрямую преобразовать целое число в строку и получить длину этой строки. В Python получить длину строки легко с помощью встроенного метода len()
. Для преобразования числа в строку мы можем использовать метод str()
.
Встроенная функция abs()
используется для получения абсолютного значения числа, то есть наша программа будет обрабатывать и тот случай, когда число будет отрицательным.
Допустим, наше входное значение равно -123. Функция abs()
преобразует его в 123, функция str()
конвертирует 123 в строку. После этого функция len()
возвращает длину строки, то есть значение 3.
Код программы на Python:
count = 0 number = int(input("Enter a number ")) print("Total number of digits: ", len(str(abs(number)))) # Результат: # Enter a number 123 # Total number of digits: 3
Примечание редакции: возможно, вас также заинтересует статья “Как разбить число на цифры в Python”.
Перевод статьи “Count number of digits in a number in Python”.
Как узнать из скольки цифр состоит число (без перевода в строку )?
Как узнать из скольки цифр состоит число на пример 456 ?
Да можно перевести в строку и там уже узнать с помощью len() и тд..
А как сделать без перевода в строку?
-
Вопрос заданболее двух лет назад
-
259 просмотров
По идее через десятичный логарифм можно:
x = 456
n = int(math.log10(x)) + 1
print(n)
с ходу в голову приходит только:
num = 456
counter = 0
while num > 0:
num //= 10
counter += 1
print(counter)
Пригласить эксперта
Ну правда, вопрос из категории дебильных. В пайтоне дин. типизация, и вам еще лень переводить число в строку?
a = 1234
a_lenght = len(str(a))
-
Показать ещё
Загружается…
27 мая 2023, в 16:19
5000 руб./за проект
27 мая 2023, в 15:46
8500 руб./за проект
27 мая 2023, в 15:20
5000 руб./за проект