Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > сколько цифр в числе


Автор: CrasyMen 8.5.2007, 18:34
как узнать сколько цифр в числе?
например: число 10000   - 5 цифр

Автор: _hunter 8.5.2007, 18:42
дели число на 10 пока результат > 1 -- получиш чсло знаков - 1.

Автор: Klin 8.5.2007, 19:51
Ну или если извращаться то можно так:
Код

 int x = 10000;
 IntToStr(x).Length();

Автор: CrasyMen 8.5.2007, 20:00
Klin,  Спасибо. Этот способ лучше предыдущего (имхо).

Автор: fish9370 8.5.2007, 20:12
Цитата(CrasyMen @ 8.5.2007,  20:00)
Klin,  Спасибо. Этот способ лучше предыдущего (имхо).

несмотря на то что, этот способ проще, я бы предпочел первый вариант - он быстрее.. и в нем нет привязки к VCL..

Автор: CrasyMen 8.5.2007, 20:17
Цитата(fish9370 @  8.5.2007,  20:12 Найти цитируемый пост)
несмотря на то что, этот способ проще

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

Автор: Voldemar2004 8.5.2007, 20:30
Код
// Функция подсчета количества цифр (проверка на цифровой символ)

#include <string.h>     // strlen()
#include <ctype.h>      // isdigit()

unsigned long NumberCount(char* Text);

unsigned long NumberCount(char* Text)
{

unsigned long Counter = 0;

        for(unsigned long i=0; i<strlen(Text); ++i)

          if ( isdigit(Text[i]) ) ++Counter;

return Counter;

}
Или так:
Код

int Num_Count(int a);

int Num_Count(int a)
{

int f;
f=0;
        do
        {
         a/=10;
         f++;
        }
        while(a);

return f;
}

Автор: Klin 8.5.2007, 20:58
Цитата(CrasyMen @  8.5.2007,  21:00 Найти цитируемый пост)
Klin,  Спасибо. Этот способ лучше предыдущего (имхо). 

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

Автор: Voldemar2004 8.5.2007, 21:43
Цитата(fish9370 @  8.5.2007,  21:12 Найти цитируемый пост)
нем нет привязки к VCL..
И соответственно будет работать везде.
Цитата(CrasyMen @  8.5.2007,  21:17 Найти цитируемый пост)
 не хочу усложнять себе жизнь. Для курсовой сойдет. 
Но потом будет легче, понимание приходит не сразу...
Цитата(CrasyMen @  8.5.2007,  21:00 Найти цитируемый пост)
Этот способ лучше предыдущего (имхо).
опять же привязка к VCL...

Автор: Жуть 9.5.2007, 11:34
а что если посчитать десятичный логарифм?
Код

int DigitsCount(int value)
{
    if ( !value )      //обработка 0
        return 1;

    int add = 1;
    if (value < 0)
    {
        value = abs(value);
    }
    return log10(double(value)) + add;
}

Автор: Voldemar2004 9.5.2007, 11:43
Жуть, оригинально smile  smile  smile , только лишний раз вызывать функцию логарифма ?

Автор: Klin 9.5.2007, 12:01
Цитата(Жуть @  9.5.2007,  12:34 Найти цитируемый пост)
а что если посчитать десятичный логарифм?

Зачем так усложнять? Самый простой способ - это деление на 10.

Автор: Жуть 9.5.2007, 12:34
Цитата(Voldemar2004 @  9.5.2007,  11:43 Найти цитируемый пост)
только лишний раз вызывать функцию логарифма ?

Цитата(Klin @  9.5.2007,  12:01 Найти цитируемый пост)
Самый простой способ - это деление на 10.

Я просто предложил альтернативу...

Продолжая оригинальничать (реализация для машин с 32битным int, оптимизация в сторону меньших чисел):
Код
int DigitsCount(int value)
{
    if (value < 0)
        value = abs(value);
    if (value < 10)
        return 1;
    else
    if ( value < 100 ) 
        return 2;
    else
    if (value < 1000 )
        return 3;
    else
    if (value < 10000 )
        return 4;
    else
    if (value < 100000 )
        return 5;
    else
    if (value < 1000000 )
        return 6;
    else
    if (value < 10000000 )
        return 7;
    else
    if (value < 100000000 )
        return 8;
    else
    if (value < 1000000000 )
        return 9;
    else
    if (value < 10000000000 )
        return 10;
    else
        return 11;
}

 smile 

Автор: fish9370 9.5.2007, 12:48
жуть, что-то тебя понесло сказал для 32битных int, а сам попетлял в дебри.. что это за 32битный int такой 10000000000 ?
по-моему ты гонишь, тут парни давно правильное решение дали.. а ты предлагаешь что-то совсем бредовое..  smile 

Автор: Klin 9.5.2007, 12:49
Жуть, если вы всегда так оригинальны, вы очень точно подобрали ник. smile

Автор: Жуть 9.5.2007, 13:01
2fish9370, 
Цитата(fish9370 @  9.5.2007,  12:48 Найти цитируемый пост)
что это за 32битный int такой 10000000000 ?

Уупс... перестарался с нулями

Цитата(fish9370 @  9.5.2007,  12:48 Найти цитируемый пост)
по-моему ты гонишь, тут парни давно правильное решение дали.. а ты предлагаешь что-то совсем бредовое..

Мое решение не работает? Работает слишком медленно? Не компилируеться? В чем бредовость? В чем неправильность ?

Автор: fish9370 9.5.2007, 13:12
Цитата(Жуть @ 9.5.2007,  13:01)
Мое решение не работает? Работает слишком медленно? Не компилируеться? В чем бредовость? В чем неправильность ?

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

да и еще, давно хотел тебе сказать..

Код

if (value < 0) 
        value = abs(value);


проверка на отрицательность тут излишняя.. достаточно было value=abs(value);  

Автор: Жуть 9.5.2007, 13:23
Цитата(fish9370 @  9.5.2007,  13:12 Найти цитируемый пост)
от структурного программирования мы перешли к линейному

В каком месте? Требую в студию определение "линейного программирования"(ато мне что-то сразу вспоминаеться Тахо и целевая ф-ция и т.д.) ! И точное определение того, где я отхожу от структурного! (можно написать подобный метод и для ООП)
Легко себе представить набор чисел, для которых заранее известно, что 90% времени они могут принимать значения в каком-л диапазоне, напр 1000 - 1000000 и когда надо вычислять их длинну ну очень часто, и тогда можно написать "каскадированный if" при котором будет значительный выигрыш во времени по сравнению с циклом...
Для разных аспектов одной и той же задачи есть разные решения.



Автор: W4FhLF 9.5.2007, 13:24
lg(|int|) + 1

Добавлено через 1 минуту и 2 секунды
+ округлить ессно

Автор: Жуть 9.5.2007, 13:28
2W4FhLF, http://forum.vingrad.ru/index.php?showtopic=150236&view=findpost&p=1127122, засмеяли...

Автор: fish9370 9.5.2007, 14:03
Цитата(Жуть @ 9.5.2007,  13:23)
В каком месте? Требую в студию определение "линейного программирования"(ато мне что-то сразу вспоминаеться Тахо и целевая ф-ция и т.д.) ! И точное определение того, где я отхожу от структурного! (можно написать подобный метод и для ООП)
Легко себе представить набор чисел, для которых заранее известно, что 90% времени они могут принимать значения в каком-л диапазоне, напр 1000 - 1000000 и когда надо вычислять их длинну ну очень часто, и тогда можно написать "каскадированный if" при котором будет значительный выигрыш во времени по сравнению с циклом...
Для разных аспектов одной и той же задачи есть разные решения.

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

Автор: W4FhLF 9.5.2007, 14:10
Цитата(Жуть @  9.5.2007,  13:28 Найти цитируемый пост)
засмеяли...


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

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