Как узнать длину числа c
Перейти к содержимому

Как узнать длину числа c

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

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

user avatar

user avatar

Для работы с 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 с для подхода «умный журнал»).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *