Как узнать длину числа без использования строк?
Например, на вход в функцию поступает число 12345. Результатом будет 5. Даже если число отрицательное, например, -1234567, то результатом будет 7.
![]()
![]()
Для работы с log10 и abs необходимо подключить библиотеку math.h (Для типа int работает корректно)
Если же входные данные типа long или long long, то лучше обойтись обычным же стопудовым вариантом — через циклы. (Выше коллеги представили множество подобных решений).
C++ — как найти длину целого числа
Я пытаюсь найти способ, чтобы найти длину целого числа (количество цифр), а затем поместить его в массив целых чисел. Задание также требует сделать это без использования классов из STL, хотя спецификация программы говорит, что мы можем использовать «общие библиотеки C» (спрошу моего профессора, могу ли я использовать cmath, потому что я предполагаю, что log10(num) + 1-Самый простой способ, но мне было интересно, есть ли другой способ).
ах, и это не должно обрабатывать отрицательные числа. Исключительно неотрицательные числа.
Я пытаюсь создать класс variant «MyInt», который может обрабатывать более широкий диапазон значений с помощью динамического массива. Любые советы будут оценены! Спасибо!
13 ответов
количество цифр целого числа n в любой базе тривиально получается путем деления, пока вы не закончите:
Не обязательно самый эффективный, но один из самых коротких и самых читаемых на C++:
Если вы можете использовать библиотеки C, то один из методов будет использовать sprintf, например,
» Я имею в виду количество цифр в целом, т. е. «123» имеет длину 3″
Нахождение длины целого числа в C
Почему бы просто не взять в log-10 логарифм абсолютного значения числа, округлить его и добавить? Это работает для положительных и отрицательных чисел, отличных от 0, и позволяет избежать необходимости использовать какие-либо функции преобразования строк.
log10 , abs , и функции floor предоставляются math.h . Например:
Вы должны заключить это в предложение, гарантируя, что the_integer != 0 , так как log10(0) возвращает -HUGE_VAL в соответствии с man 3 log
Кроме того, вы можете добавить единицу к конечному результату, если входные данные отрицательны, если вас интересует длина числа, включая его отрицательный знак.
N.B. Природа вычислений с плавающей запятой, используемых в этом методе, может привести к тому, что он будет медленнее, чем более прямой подход. См. Комментарии к ответу Канкан для обсуждения эффективности.
Если вас интересуют быстрые и очень простые решения, следующее может быть наиболее быстрым (это зависит от распределения вероятностей рассматриваемых чисел):
Хотя он может и не выиграть призы за самое оригинальное решение, его легко понять, а также выполнить — так быстро.
На Q6600 с использованием MSC я сравнил это с помощью следующего цикла:
Это решение занимает 0,062 с, второе по быстродействию решение Пита Киркхэма с использованием подхода интеллектуального логарифма — 0,115 с — почти вдвое дольше. Однако для чисел около 10000 и ниже смарт-журнал работает быстрее.
За счет некоторой ясности вы можете более надежно превзойти Smart-Log (по крайней мере, на Q6600):
Это решение по-прежнему составляет 0,062 с для больших чисел и уменьшается до 0,09 с для меньших чисел — в обоих случаях быстрее, чем подход с использованием смарт-журнала. (gcc делает более быстрый код; 0,052 для этого решения и 0,09 с для подхода «умный журнал»).