C++ — как найти длину целого числа
Я пытаюсь найти способ, чтобы найти длину целого числа (количество цифр), а затем поместить его в массив целых чисел. Задание также требует сделать это без использования классов из STL, хотя спецификация программы говорит, что мы можем использовать «общие библиотеки C» (спрошу моего профессора, могу ли я использовать cmath, потому что я предполагаю, что log10(num) + 1-Самый простой способ, но мне было интересно, есть ли другой способ).
ах, и это не должно обрабатывать отрицательные числа. Исключительно неотрицательные числа.
Я пытаюсь создать класс variant «MyInt», который может обрабатывать более широкий диапазон значений с помощью динамического массива. Любые советы будут оценены! Спасибо!
13 ответов
количество цифр целого числа n в любой базе тривиально получается путем деления, пока вы не закончите:
Не обязательно самый эффективный, но один из самых коротких и самых читаемых на C++:
Если вы можете использовать библиотеки C, то один из методов будет использовать sprintf, например,
» Я имею в виду количество цифр в целом, т. е. «123» имеет длину 3″
C ++ — как найти длину целого числа
Я пытаюсь найти способ найти длину целого числа (количество цифр), а затем поместить его в целочисленный массив. Назначение также требует сделать это без использования классов из STL, хотя в спецификации программы говорят, что мы можем использовать «общие библиотеки C» (спросите моего профессора, могу ли я использовать cmath, потому что я предполагаю log10 (num) + 1 — самый простой способ, но мне было интересно, есть ли другой способ).
Ah, и это не должно обрабатывать отрицательные числа. Исключительно неотрицательные числа.
Я пытаюсь создать вариант «MyInt», который может обрабатывать более широкий диапазон значений с использованием динамического массива. Любые советы будут оценены! Спасибо!
Нахождение длины целого числа в C
Я хотел бы знать, как я могу найти длину целого числа в C.
- 1 => 1
- 25 => 2
- 12512 => 5
- 0 => 1
Как я могу сделать это на C?
задан 18 июн ’10, 06:06
Каково определение «длины», если целое число равно 0? Отрицательный? — kennytm
Видеть stackoverflow.com/questions/679602/…. Это почти дубликат, но не точный, поскольку это вопрос .NET. — ChrisF♦
правильный вопрос — это не длина целого числа, а минимальное количество десятичных цифр, необходимых для представления этого числа (содержащегося в C int). log10 — ваш друг: log10 (10000) = 4, +1 количество цифр (log10 должно быть усечено) . если число отрицательное, вам понадобится еще один для символа -, если вы хотите его посчитать, и log10 (-num) (поскольку журнал отрицательного числа «проблематичен». — ShinTakezou
Насколько вы уверены, что log10(10000) вернет 4, а не 3.999999 . — Keith Thompson
Хм. Эксперимент показывает, что log10(10**n) дает точное значение для степеней 10 от 1 до 2 ** 19, по крайней мере, с gcc и glibc. Но я бы не стал рассчитывать на это для всех реализаций. ( ** обозначает возведение в степень; в C. нет такого оператора) — Keith Thompson
26 ответы
Почему бы просто не взять десятичный логарифм абсолютного значения числа, округлить его в меньшую сторону и добавить единицу? Это работает для положительных и отрицательных чисел, отличных от 10, и позволяет избежать использования каких-либо функций преобразования строк.
Компания log10 , abs floor функции предоставляются math.h . Например:
Вы должны заключить это в предложение, гарантирующее, что the_integer != 0 , поскольку log10(0) Возвращает -HUGE_VAL в соответствии с man 3 log .
Кроме того, вы можете добавить единицу к окончательному результату, если ввод отрицательный, если вас интересует длина числа, включая его отрицательный знак.
NB Вычисления с плавающей запятой в этом методе могут быть медленнее, чем при более прямом подходе. См. Комментарии к ответу Кангкана для обсуждения эффективности.
На самом деле вы должны использовать пол и добавить вместо него 1. Math.Ceil (Math.Log (99)) = 2, но Math.Ceil (Math.Log (10)) = 1. Math.Floor (Math.Log (99)) + 1 = 2 и Math.Floor (Math. Журнал (10)) = 2 — Сани Сингх Хуттунен
Вопрос не совсем ясен в определении длины (так что вы, возможно, могли подумать «количество цифр, исключая ведущие нули»), но я ожидал бы, что 0 и -1 вернут 1 и 2 как длину их символьного представления, а чем -2147483648 и 1. — Пит Киркхэм
@Pete Спасибо, что напомнили мне об ограничении домена журнала и регистре отрицательных чисел — я отредактировал свой ответ. — Джордан Льюис
+1 красиво и коротко — это мой предпочтительный ответ, даже если он самый медленный — в конце концов, разница в скорости не велика, и такой код вряд ли будет перфомансом. все равно узкое место. — Эамон Нербонн
Это не работает для 999999999999999999, целого числа C, которое будет преобразовано в большее двойное значение и, таким образом, приведет к ошибочному подсчету цифр. ОП не указал int , просто целое число. — chqrlie
Если вас интересует быстро и очень просто решение, следующее может быть самым быстрым (это зависит от распределения вероятностей рассматриваемых чисел):
Хотя за самое оригинальное решение он может и не получить призов, его легко понять и также легко выполнить — так что это быстро.
На Q6600, использующем MSC, я проверил это с помощью следующего цикла:
Это решение занимает 0.062 с, второе по скорости решение Пита Киркхэма, использующее подход интеллектуального логарифма, занимает 0.115 с — почти в два раза дольше. Однако для чисел около 10000 и ниже смарт-журнал работает быстрее.
Ценой некоторой наглядности можно более надежно обыграть smart-log (по крайней мере, на Q6600):
Это решение по-прежнему составляет 0.062 с для больших чисел и снижается до 0.09 с для меньших чисел — быстрее в обоих случаях, чем подход интеллектуального журнала. (gcc делает код быстрее; 0.052 для этого решения и 0.09 с для подхода с умным журналом).
Я содрогаюсь при мысли о том, как будет выглядеть вторая версия, полностью написанная с тернарным оператором . — Эамон Нербонн
Если бы это использовалось для пережевывания длинных списков чисел, количество разветвленного кода вызвало бы хаос в ЦП. s branch prediction and not produce the fastest execution I Боюсь. — Ллойд Кроули
В моем тесте это по-прежнему самое быстрое решение — обратите внимание, что для всех других интегральных решений также требуется несколько ветвей, и единственная реальная альтернатива — преобразование int в double с журналом с плавающей запятой (что, как оказалось, тоже недешево) . — Эамон Нербонн
Количество цифр
Время от времени перед программистом стает задача нахождения количества цифр в числе. Есть много способов решения этой задачи. В статье мы рассмотрим наиболее популярные из них.
Длина строки
Это очень простой вариант определения количества цифр, заключается в переводе числа в строковое представление с последующим определением длины строки.
Такой метод компактный и интуитивно понятный, однако он сильно проигрывает в быстродействии другим вариантам.
Десятичный логарифм
Использование десятичного логарифма для определения количества цифр в числе, позволяет производить вычисление за линейное время.