Форум программистов, компьютерный форум CyberForum.ru

Как узнать длину числа? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 179, средняя оценка - 4.66
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
02.05.2010, 11:46     Как узнать длину числа? #1
Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,126
Записей в блоге: 26
03.05.2010, 12:35     Как узнать длину числа? #21
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это исправляется просто
Сергей, 99% ошибок обладают тем свойством, что легко исправляются. Но далеко не все из них легко находятся. Особенно в больших программах. особенно когда программу пишет большая команда из дофига человек.

Методология (а не конкретное решение конкретной задачи) Manjak'а конкретно в данном случае оказалась более правильной. Ошибка, которую допустили в методе с делением, при подходе с стандартными функциями не проявилась бы по определению. Время, потраченное на реализацию, в обоих способах одинаковое (ибо и там и там всё решается парой строк). Но время на отладку в одном случае строго равно нулю, а в другом случае могло оказаться и фатально большим (в зависимости от конкретной программы, в которой бы решалась данная задача).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
03.05.2010, 12:40     Как узнать длину числа? #22
Не знаю, в цикле делить все время - лишние расходы по времени. Вот набросал функцию, которая показывает алгоритм(дихотомию напоминает )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int getLength(int ch)
{
    if(ch / 10000 > 1)
    {
        if(ch / 10000000 > 1)
        {
            if(ch / 1000000000 > 1)
                return 10;
            else
                if(ch / 100000000 > 1)
                    return 9;
                else
                    return 8;
        }
        else
        {
            if(ch / 1000000 > 1)
                return 7;
            else
                if(ch / 100000 > 1)
                    return 6;
                else
                    return 5;  
        }
    }
    else
    {
        if(ch / 100 > 1)
        {
            if(ch / 1000 > 1)
                return 4;
            else
                return 3;
        }
        else
        {
            if(ch / 10 > 1)
                return 2;
            else
                return 1;
        }
    }
}
Написан некрасиво, но у кого будет желание - перепишите покрасивее
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.05.2010, 12:43     Как узнать длину числа? #23
вот ещё вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int numlen(int num){
    int i;
    for ( i = 1; num /= 10; ++i )
        ;
    return i;
}
 
int main(void){
    int num;
    printf("Number: ");
    scanf("%d", &num);
    printf("%d digits.\n", numlen(num));
    return 0;
}
и ноль и отрицательные числа нормально считаются. Если только за границу int не выходят...
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 12:59     Как узнать длину числа? #24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int numlen (int num)
{
    unsigned int v = num > 0 ? num : -num;
    int lb10 = (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000) ? 7 :
               (v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) ? 4 :
               (v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0;
    return lb10 + 1;
}
 
int main()
{
    int x = -123456789;
    cout << numlen(x) << endl;
    return 0;
}
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
03.05.2010, 13:03     Как узнать длину числа? #25
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:07     Как узнать длину числа? #26
Цитата Сообщение от M128K145 Посмотреть сообщение
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
Какой смысл в твоём посте?
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
03.05.2010, 13:16     Как узнать длину числа? #27
Roma_F, деление на 2 интервала и проверка уже только на одном из них. Ознакомьтесь http://ru.wikipedia.org/wiki/%D0%94%...BC%D0%B8%D1%8F
Я смогу определить что число длиной в 10 знаков уже на 3 шаге, а вы только на 10. Разницу чувствуете?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:21     Как узнать длину числа? #28
M128K145, я имел в виду пост, который я процитировал

Цитата Сообщение от M128K145 Посмотреть сообщение
Я смогу определить
я верю, верю

Я всего лишь предложил ещё один вариант - какой в этом смысл? - наверное мне нечем занятся, вот сижу и "постю"
Nike775
 Аватар для Nike775
4 / 3 / 1
Регистрация: 01.04.2010
Сообщений: 30
03.05.2010, 13:21     Как узнать длину числа? #29
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:24     Как узнать длину числа? #30
Евгений, я согласен с тобой, что в случае, если по результатам выполнения изначального варианта с циклом для нуля будет выделяться память, то результат будет плачевным.
Но телодвижения с переводом числа в строку и подсчет ее длины, по моему мению, выглядят как то чуждо для данной задачи. Кроме того, если учесть необходимость обработки отрицательных чисел, то появяться дополнительные телодвижения, связанные с необходимостью избавления от знака.
Цитата Сообщение от Nike775 Посмотреть сообщение
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
Каким образом?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 13:24     Как узнать длину числа? #31
Я смогу определить что число длиной в 10 знаков уже на 3 шаге, а вы только на 10. Разницу чувствуете?
M128K145:
Про скорость я тоже говорил.
Вопрос: как почувствовать разницу, у меня 4 гига, 4 ведра*2.55 ГГц.
Как не тыкал программу, не чувствуется.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:27     Как узнать длину числа? #32
M128K145, я нашёл смысл в своём варианте ))
В билдере (у которого видимо туго с оптимизациями) он работает в 4 раза быстрее способа с циклом while.
В code::blocks одинаково.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:28     Как узнать длину числа? #33
Цитата Сообщение от M128K145 Посмотреть сообщение
Не знаю, в цикле делить все время - лишние расходы по времени. Вот набросал функцию, которая показывает алгоритм(дихотомию напоминает )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int getLength(int ch)
{
    if(ch / 10000 > 1)
    {
        if(ch / 10000000 > 1)
        {
            if(ch / 1000000000 > 1)
                return 10;
            else
                if(ch / 100000000 > 1)
                    return 9;
                else
                    return 8;
        }
        else
        {
            if(ch / 1000000 > 1)
                return 7;
            else
                if(ch / 100000 > 1)
                    return 6;
                else
                    return 5;  
        }
    }
    else
    {
        if(ch / 100 > 1)
        {
            if(ch / 1000 > 1)
                return 4;
            else
                return 3;
        }
        else
        {
            if(ch / 10 > 1)
                return 2;
            else
                return 1;
        }
    }
}
Написан некрасиво, но у кого будет желание - перепишите покрасивее
Подход интересный, но есть проблема в виде ограничения количества цифр в числе до 10.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
03.05.2010, 13:31     Как узнать длину числа? #34
Genius Ignat, это уже не программирование, а математика
Дело в подходе. Надо с самого начала привыкать писать что-то более-менее оправданное с точки зрения алгоритма, иначе все уравнения сейчас решались бы методом полного перебора и дихотомию бы не изобрели(а также золотого сечения, у них смысл один и тот же, только коефициенты разные). Согласитесь, это простая модель, а если ее перенести на более сложную? И действие - не деление, а вычисления уравнения 4 порядка с просчетом производных всех 3 степеней по всем переменным?

CyBOSSeR, так для типа int все же Его при желании можно переделать
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 13:31     Как узнать длину числа? #35
CyBOSSeR:
А больше может и не надо.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:36     Как узнать длину числа? #36
Цитата Сообщение от M128K145 Посмотреть сообщение
CyBOSSeR, так для типа int все же
M128K145, а если учесть, что размер типа int точно не оговорен в стандарте? Посему делать предположения о его размере не стоит.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
03.05.2010, 13:50     Как узнать длину числа? #37
Genius Ignat, тогда, скорее всего, разумнее все же переводить в строку и считать ее длину - 2(десятичная точка и '\0')

Добавлено через 4 минуты
CyBOSSeR, можете расценивать как попытку выкрутится(но не везде сработает)
C++
1
#define int long
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 13:52     Как узнать длину числа? #38
numeric_limits<> для таких целей есть, хотя это и дурной стиль делать код зависимым от платформы
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 14:00     Как узнать длину числа? #39
Цитата Сообщение от M128K145 Посмотреть сообщение
#define int long
C++
1
__int32  x;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 14:18     Как узнать длину числа?
Еще ссылки по теме:

Как узнать длину строки, содержащей кириллицу? C++
C++ Как узнать длину указателя (в байтах)?
C++ Как узнать длину строки TCHAR?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 14:18     Как узнать длину числа? #40
Не большой итог теме:
Оба способа деление /10 и itoa + strlen приемлемы, и дело не в быстродействии,
а просто в решении задачи поставленной задачи.
Просто деление: это скорее всего то что ожидает увидеть преподаватель...
В любом случае все рассмотренные способы, автору могут пригодиться...
Yandex
Объявления
03.05.2010, 14:18     Как узнать длину числа?
Ответ Создать тему
Опции темы

Текущее время: 09:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru