Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/777: Рейтинг темы: голосов - 777, средняя оценка - 4.90
 Аватар для Psixodelik
42 / 41 / 5
Регистрация: 27.11.2009
Сообщений: 100

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

02.05.2010, 11:46. Показов 147636. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2010, 11:46
Ответы с готовыми решениями:

Как узнать длину массива
например объявил массив char x, ввел в него gets(x), теперь в массиве строка, но как узнать длину этой строки length(x) не работает

Как узнать длину массива?
Функция в качестве параметра получает массив BYTE*. Как узнать его длину?

Узнать длину строки и длину каждого слова
есть код который реверсирует слова в строке. Как узнать длину слова(например 3 слова ) и количество символов ? #include...

45
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.05.2010, 12:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это исправляется просто
Сергей, 99% ошибок обладают тем свойством, что легко исправляются. Но далеко не все из них легко находятся. Особенно в больших программах. особенно когда программу пишет большая команда из дофига человек.

Методология (а не конкретное решение конкретной задачи) Manjak'а конкретно в данном случае оказалась более правильной. Ошибка, которую допустили в методе с делением, при подходе с стандартными функциями не проявилась бы по определению. Время, потраченное на реализацию, в обоих способах одинаковое (ибо и там и там всё решается парой строк). Но время на отладку в одном случае строго равно нулю, а в другом случае могло оказаться и фатально большим (в зависимости от конкретной программы, в которой бы решалась данная задача).
1
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
03.05.2010, 12:40
Не знаю, в цикле делить все время - лишние расходы по времени. Вот набросал функцию, которая показывает алгоритм(дихотомию напоминает )
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;
        }
    }
}
Написан некрасиво, но у кого будет желание - перепишите покрасивее
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,978
03.05.2010, 12:43
вот ещё вариант
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 не выходят...
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 12:59
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;
}
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
03.05.2010, 13:03
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:07
Цитата Сообщение от M128K145 Посмотреть сообщение
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
Какой смысл в твоём посте?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
03.05.2010, 13:16
Roma_F, деление на 2 интервала и проверка уже только на одном из них. Ознакомьтесь http://ru.wikipedia.org/wiki/%... 0%B8%D1%8F
Я смогу определить что число длиной в 10 знаков уже на 3 шаге, а вы только на 10. Разницу чувствуете?
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:21
M128K145, я имел в виду пост, который я процитировал

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

Я всего лишь предложил ещё один вариант - какой в этом смысл? - наверное мне нечем занятся, вот сижу и "постю"
0
 Аватар для Nike775
3 / 2 / 0
Регистрация: 01.04.2010
Сообщений: 30
03.05.2010, 13:21
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:24
Евгений, я согласен с тобой, что в случае, если по результатам выполнения изначального варианта с циклом для нуля будет выделяться память, то результат будет плачевным.
Но телодвижения с переводом числа в строку и подсчет ее длины, по моему мению, выглядят как то чуждо для данной задачи. Кроме того, если учесть необходимость обработки отрицательных чисел, то появяться дополнительные телодвижения, связанные с необходимостью избавления от знака.
Цитата Сообщение от Nike775 Посмотреть сообщение
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
Каким образом?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 13:24
Я смогу определить что число длиной в 10 знаков уже на 3 шаге, а вы только на 10. Разницу чувствуете?
M128K145:
Про скорость я тоже говорил.
Вопрос: как почувствовать разницу, у меня 4 гига, 4 ведра*2.55 ГГц.
Как не тыкал программу, не чувствуется.
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:27
M128K145, я нашёл смысл в своём варианте ))
В билдере (у которого видимо туго с оптимизациями) он работает в 4 раза быстрее способа с циклом while.
В code::blocks одинаково.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:28
Цитата Сообщение от 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.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
03.05.2010, 13:31
Genius Ignat, это уже не программирование, а математика
Дело в подходе. Надо с самого начала привыкать писать что-то более-менее оправданное с точки зрения алгоритма, иначе все уравнения сейчас решались бы методом полного перебора и дихотомию бы не изобрели(а также золотого сечения, у них смысл один и тот же, только коефициенты разные). Согласитесь, это простая модель, а если ее перенести на более сложную? И действие - не деление, а вычисления уравнения 4 порядка с просчетом производных всех 3 степеней по всем переменным?

CyBOSSeR, так для типа int все же Его при желании можно переделать
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 13:31
CyBOSSeR:
А больше может и не надо.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:36
Цитата Сообщение от M128K145 Посмотреть сообщение
CyBOSSeR, так для типа int все же
M128K145, а если учесть, что размер типа int точно не оговорен в стандарте? Посему делать предположения о его размере не стоит.
2
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
03.05.2010, 13:50
Genius Ignat, тогда, скорее всего, разумнее все же переводить в строку и считать ее длину - 2(десятичная точка и '\0')

Добавлено через 4 минуты
CyBOSSeR, можете расценивать как попытку выкрутится(но не везде сработает)
C++
1
#define int long
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 13:52
numeric_limits<> для таких целей есть, хотя это и дурной стиль делать код зависимым от платформы
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 14:00
Цитата Сообщение от M128K145 Посмотреть сообщение
#define int long
C++
1
__int32  x;
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 14:18
Не большой итог теме:
Оба способа деление /10 и itoa + strlen приемлемы, и дело не в быстродействии,
а просто в решении задачи поставленной задачи.
Просто деление: это скорее всего то что ожидает увидеть преподаватель...
В любом случае все рассмотренные способы, автору могут пригодиться...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2010, 14:18
Помогаю со студенческими работами здесь

Как узнать длину указателя (в байтах)?
как узнать длину указателя(в байтах) sizeof(указатель)почему то не работает?

Как узнать длину динамического массива?
Как узнать длину динамического массива?

Как узнать длину строки TCHAR?
Как узнать длину строки? TCHAR szText = _T(&quot;&quot;); Добавлено через 1 минуту 1 IntelliSense: идентификатор &quot;_tsclen&quot; не...

Как узнать длину строки, содержащей кириллицу?
Сделал такой код #include &lt;string&gt; #include &lt;iostream&gt; int main (int argc, char * argv){ std::string...

Как узнать длину строки у двумерного динамического массива
Выделаю память для строк столбцов массива так: int n=11; int **mas = new int *; Потом каждому столбцу выделаю разное...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru