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

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

  • автор:

Персональный блог Толика Панкова

Стихи, рассказы, философия, IT, политика, панкизм, раздолбайство и болтовня.

По словам телеведущего Д. Киселева, Николай Валуев внес в Думу законопроект о полном запрете клоуна Ю. Куклачева

C#, Количество цифр (разрядов) числа.

Пост из серии «спрашивали — отвечаем», довольно стандартная учебная задача, никакой особой военной хитрости нет, но раз уж, что б нет то.

Преобразование числа в строку и подсчет символов

Самый простой, дубовый, но самый медленный по времени выполнения способ. Обычно в школе за него по рукам бьют ��

Получаем модуль числа [ (int)Math.Abs(n) ], чтоб исключить ситуацию, если в n окажется отрицательное число, преобразуем число в строку и получаем количество символов в строке, т.е. количество цифр числа.

Подсчет цифр делением нацело

Способ заключается в том, чтобы последовательно делить число на 10 , оставляя от деления целую часть, пока целая часть не станет равна 0 .

Можно сделать в двух вариантах.

Какая-то специальная функция для деления нацело в C# не нужна, при делении переменной цельночисленного типа ( byte , sbyte , short , ushort , int , uint , long , ulong ) на целое число или цельночисленную переменную, результатом будет целое число, т.е. деление нацело произойдет автоматически.

Определение количества разрядов у числа

Написал программку, которая должна определять количество разрядов у чисел. При вводе двухзначных и трехзначных, программа правильно определяет разряд, но при вводе четырехзначных чисел и более, начинает определять неправильно. Помогите определить проблему.

Определение количества разрядов числа через функцию
Вводится последовательность из N целых чисел. Найти количество двух- и количество трех-разрядных.

Проверить как изменится количество разрядов в числе M по сравнению с количеством разрядов числа N
Дано натуральное число N. Определить M=N! Проверить как измениться количевство разрядов в числе M.

Проверить, как изменилось количество разрядов в числе M по сравнению с количеством разрядов числа N
Выручайте. Дано натуральное число N. Определить M=N!. Проверить, как изменилось количество.

Функцией оформить определение количества делителей числа
Вводится последовательность целых чисел, 0 – конец последовательности. Для каждого числа.

Сообщение от mikhail90

Написал программку, которая должна определять количество разрядов у чисел. При вводе двухзначных и трехзначных, программа правильно определяет разряд, но при вводе четырехзначных чисел и более, начинает определять неправильно. Помогите определить проблему.

Сообщение от Bend3r
Сообщение от alsav22
Сообщение от Хулиган
Сообщение от Bend3r
Сообщение от Bend3r
Сообщение от Хулиган
Сообщение от alsav22
Сообщение от Хулиган
Сообщение от Хулиган

Ну ваш код у меня в C++ Builder 6, не компилировался.

Добавлено через 1 минуту

Сообщение от alsav22

Сообщение от Хулиган
Сообщение от Thinker
Сообщение от Хулиган

Определение количества нулей в двоичной записи числа
Определить, сколько нулей в двоичной записи произвольного числа А (100<А<1000)?

Определение количества нулей среди цифр заданного числа
Дано натуральное число n. Составьте программу, определяющую количество нулей среди всех цифр числа.

Обработка различного количества разрядов числа
Доброго времени суток, уважаемые форумчане! Нужна Ваша помощь. Сделал метод, который принимает в.

выявлять числа, у которых сумма чётных разрядов равна сумме нечётных разрядов
помогите решить задачку: До получения исла равного 0 выявлять числа, среди последовательносьти из.

Определение количества вхождений числа в матрице
и снова здравствуйте) помогите решить задачу: найти количество вхождений заданного числа в массив.

Как узнать количество десятичных знаков в числе c?

Я пытаюсь получить количество десятичных знаков, которое имеет число в c: 0,0001 -> 4 десятичных знака, 3,54235 -> 5 десятичных знаков и т. Д. (Если вы не понимаете, количество чисел после запятой). наш учитель говорит, что это можно сделать двумя способами, используя веревку и не используя веревку. Я решил, что не буду использовать струны, потому что у меня нет опыта со струнами.

Так вот что я придумал

При вызове функции он должен возвращать количество десятичных знаков, которое я рассчитал, но это не так, на самом деле он застревает в бесконечном цикле.

Идея, лежащая в основе этого кода, заключалась в том, чтобы для каждого числа в «строке» чисел довести их до 0, а затем проверить, было ли общее число 0

Но это оставляет мне две проблемы: 1 как определить количество чисел перед запятой, например, 5564.34234, этот код не будет работать, потому что он будет считать до 8, прежде чем полное число станет сплошным 0. и поэтому не вернет правильное количество десятичных знаков. .2. код, который я разработал, не работает. Просто застревает в бесконечном цикле. Не знаю, где создается бесконечность цикла.

Как заставить этот код работать?

PS. Я нашел эту статью об этой проблеме в Java: Как узнать, сколько десятичных знаков в числе? но в нем используются строки, и мне бы это не понравилось из-за того, что я не знаю, как использовать строки.

Edit: Вот еще один фрагмент кода, который я пробовал и который действительно потерпел неудачу, давая результат 50, когда вы вводите число больше 1 и 0, если число меньше 0 (я не понимаю, немножко) в любом случае вот код:

4 ответа

Если вас не волнует округление, вам не нужно считать количество десятичных знаков, вы можете просто подсчитать количество двоичных знаков. Это потому, что 10 содержит 2 как множитель ровно один раз, поэтому 10 ^ n и 2 ^ n имеют одинаковое количество 2 как множители. Самый быстрый способ подсчитать количество двоичных разрядов — это получить показатель степени числа с плавающей запятой.

Например двоичный 0,001 занимает 3 десятичных разряда для представления 0,125, 0,0001 занимает 4 0,0625.

Вы можете получить дробную часть значения и продолжать умножать на 2 и удалять целое число, как люди предлагали сделать с 10 (это даст вам тот же ответ).

Или вы можете получить больше удовольствия от оптимизации решения (большую часть работы выполняет функция мест):

Алгоритм bitCounting был найден здесь.

Рассмотрим мое решение на основе строк:

Но следует помнить о возможных ошибках округления и точности.

Примечание: я использовал тип double , поскольку float функция modff должна использоваться вместо modf , а FLT_DIG вместо DBL_DIG

  • Начните с числа с плавающей запятой, скажем, a = 3.0141589
  • Сделайте часть перед десятичной запятой 0, вычтя целую часть, оставив 0,0141589
  • В цикле умножьте a на 10 и сохраните целую часть, это даст вам список цифр от 0 до 9.
  • Из этого списка выведите количество десятичных знаков

В этом алгоритме есть некоторые интересные детали, которые вы должны узнать, и я не буду портить вам веселье или сюрпризы.

Лучше всего читать ввод как строку и просто считать цифры после ‘.’. Числа с плавающей запятой не являются точным представлением, т.е. десятичные значения хранятся в двоичном виде внутри и могут не точно представлять истинное десятичное значение. Однако каждое двоичное представление — это некоторое десятичное число с конечными цифрами.

Как определить количество цифр целого числа в C?

Думаю, я мог бы просто превратить его в строку, а затем получить длину строки, но это кажется запутанным и хакерским.

задан 01 июля ’09, 09:07

В случае отрицательных чисел получить длину строки не удастся. Так что вместо этого получите длину абсолютного значения. 😉 — Wim ten Brink

char buff [100]; int r = sprintf (бафф, «% s», n) — (r <0); — paxdiablo

вы имеете ввиду десятичные цифры? десятичные разряды — это то, что есть у реальных чисел, а у целых нет по определению. — Will

Э . Пакс, это законное выражение? Поскольку r не имеет значения перед присваиванием, часть «(r <0)» кажется пугающей. Или, возможно, вы имели в виду, что это следует сделать в качестве второго шага, так что это просто обозначение, которое я не получаю (я читаю его, как если бы это был C). — unwind

Надо . помнить . о . модульном . тестировании! char buff [100]; int r = sprintf (бафф, «% d», n) — (n <0); — paxdiablo

20 ответы

ответ дан 04 мая ’15, 18:05

Это будет излишне медленным. Не используйте без причины дорогостоящие функции, такие как log10 (). Быстрая целочисленная функция достаточно проста, чтобы ее писать. — штормовая душа

Господи .. вы все еще используете 8088? Кого волнует несколько лишних тактовых циклов. Пас потребовалось 100,000,000 итераций, чтобы добиться ощутимой разницы, и даже это было ничтожно мало! 6 секунд! Угу-ди-до .. продолжай жить своей жизнью. В следующем году будет 3 секунды. — Eduffy

@eduffy: миллисекунда здесь, миллисекунда там . и внезапно пользователь чувствует заметную задержку после нажатия кнопки. Серьезно, эти небольшие недостатки складываются. Зачем тратить циклы часов, если это ничего не дает? — штормовая душа

@eduffy: если бы это было запущено на встроенном процессоре, могло бы не быть поддержки с плавающей запятой, не говоря уже о функциях журнала, а тактовая частота могла быть только в десятках МГц, поэтому решение, полностью основанное на целых числах, определенно было бы предпочтительный вариант. — Стив Мельникофф

Оказывается, хотя простое деление быстрее для небольших значений, логарифм масштабируется намного лучше. Если вы вызываете алгоритмы деления с каждым int от MIN_INT до MAX_INT (и повторяете это 100 миллионов раз, как в примерах Paz), вы получаете в среднем 13.337 секунд на вызов. То же самое с логарифмом занимает в среднем 8.143 секунды, рекурсия занимает 11.971 секунды, а каскадные операторы If занимают в среднем 0.953 секунды. Итак, решение, похожее на Daily-WTF, на порядок быстрее, но в долгосрочной перспективе оно находится на втором месте. — Мэтт Пуш

Или сырая скорость:

Те, что указаны выше, были изменены, чтобы лучше обрабатывать MININT. О любых странных системах, которые не следуют разумному 2 n два правила дополнения для целых чисел, они могут нуждаться в дальнейшей корректировке.

Версия с необработанной скоростью фактически превосходит версию с плавающей запятой, модифицированную ниже:

После ста миллионов итераций я получаю следующие результаты:

Это на самом деле меня немного удивило — я думал, что чипы Intel имеют приличный FPU, но я полагаю, что общие операции FP по-прежнему не могут конкурировать с оптимизированным вручную целочисленным кодом.

Обновите следующие предложения stormsoul:

Тестирование многократно-итеративного решения с помощью stormsoul дает результат в 4 секунды, поэтому, хотя оно намного быстрее, чем решение с делением-итерацией, оно по-прежнему не соответствует оптимизированному решению if-statement.

Выбор аргументов из пула, состоящего из 1000 случайно сгенерированных чисел, увеличил время необработанной скорости до 2 секунд, поэтому, хотя кажется, что, возможно, было некоторое преимущество в том, чтобы иметь один и тот же аргумент каждый раз, это все еще самый быстрый из перечисленных подходов.

Компиляция с -O2 улучшила скорость, но не относительное положение (я увеличил количество итераций в десять раз, чтобы проверить это).

Любой дальнейший анализ должен будет серьезно затронуть внутреннюю работу эффективности ЦП (различные типы оптимизации, использование кешей, прогноз ветвления, какой у вас процессор, температура окружающей среды в комнате и т. Д.), Которая будет снижаться. мешать моей оплачиваемой работе :-). Это было интересное развлечение, но в какой-то момент окупаемость инвестиций в оптимизацию становится слишком маленькой, чтобы иметь значение. Думаю, у нас достаточно решений, чтобы ответить на вопрос (который, в конце концов, не касался скорости).

Это будет мое последнее обновление этого ответа, исключая вопиющие ошибки, не зависящие от архитектуры. Вдохновленный доблестными усилиями Stormsoul по измерению, я публикую свою тестовую программу (измененную в соответствии с собственной тестовой программой Stormsoul) вместе с некоторыми примерными цифрами для всех методов, показанных в ответах здесь. Имейте в виду, что это включено конкретная машина, ваш пробег может варьироваться в зависимости от того, где вы его запускаете (поэтому я публикую тестовый код).

Делайте с ним как хотите:

Помните, что вам нужно убедиться, что вы используете правильную командную строку для его компиляции. В частности, вы май необходимо явно указать математическую библиотеку, чтобы получить log10() работающий. Командная строка, которую я использовал в Debian, была gcc -o testprog testprog.c -lm .

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

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