Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > Узнать кол-во разрядов в неком числе


Автор: En_t_end 1.8.2005, 14:53
...с помощью математико-синтаксических манипуляций в C++. Что-то мне подсказывает, что решение кроется в испольовании '%' и манипуляции с остатками от деления. smile

Автор: maxim1000 1.8.2005, 15:01
а как заданно число?
если оно вводится через строку - просто количество символов smile
если оно представлено чем-то вроде int, то тут есть два варианта:
1. делаем цикл, делим число на N(основание системы счисления), пока не ноль, количество делений - количество разрядов
2. берем логарифм от числа по основанию N, его целая часть - количество разрядов...

Автор: Akina 1.8.2005, 15:01
Конвертировать в строку, отбросить (при наличии) порядок, вырезать точку, удалить с обоих концов оставшейся строки нули-пробелы... длина строки = кол-ву разрядов числа.
Осталось избежать ошибки представления.

Автор: maxim1000 1.8.2005, 15:03
упс... не подумал о нецелых числах...

Автор: En_t_end 1.8.2005, 15:04
maxim1000
unsigned long

Akina
Как-то это растратно по ресурсам smile

Автор: Akina 1.8.2005, 15:11
Цитата(En_t_end @ 1.8.2005, 16:04)
unsigned long

Тогда граничная таблица - быстрее по-любому не будет.


Автор: maxim1000 1.8.2005, 15:16
Цитата
Тогда граничная таблица - быстрее по-любому не будет

если прикрутить двоичный поиск, то да...
а если линейный, то еще неизвестно, что быстрее - деление или таблица (там все в регистрах, но деление, а там - доступ к памяти)

Автор: Akina 1.8.2005, 15:39
maxim1000
smile
м-м-м... деление-сравнение... по конвейерам не разбросаешь... а вот чтение-сравнение (если опоздать на команду) - запросто.
smile

Автор: maxim1000 1.8.2005, 15:44
Цитата
деление-сравнение

не очень уверен, но мне кажется, что в случае деления как такового сравнения и не нужно
насколько я припоминаю, во многих процессорах есть флаг, содержащий (последний результат==0)
(по крайней мере на некоторых процессорах, с которыми я работал, такой флажок был)

Автор: Akina 1.8.2005, 15:57
есть... ZF... даже в 4004 процессоре был. Однако должен огорчить - DIV reg16 не меняет ZF... так что по-любому OR ax,ax; JE label;

Автор: En_t_end 1.8.2005, 16:53
Цитата(maxim1000 @ 1.8.2005, 19:01)
2. берем логарифм от числа по основанию N, его целая часть - количество разрядов...

То есть такой вариант будет верен при любом X(unsigned long) ?
Код

floor(log10(X))

Автор: maxim1000 1.8.2005, 16:55
Цитата
То есть такой вариант будет верен при любом X(unsigned long) ?

вроде должен
но с таблицой все должно бы быть быстрее (если вдруг сопроцессор не вздумает вычислять log за несколько тактов)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)