С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 179, средняя оценка - 4.66
Psixodelik
40 / 39 / 2
Регистрация: 27.11.2009
Сообщений: 100
#1

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

02.05.2010, 11:46. Просмотров 27780. Ответов 44
Метки нет (Все метки)

Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2010, 11:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как узнать длину числа? (C++):

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

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

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

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

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

Как узнать длину строки, содержащей кириллицу? - C++
Сделал такой код #include <string> #include <iostream> int main (int argc, char * argv){ std::string test="проверка"; ...

44
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 12:03 #16
C++
1
2
3
4
5
6
7
8
9
10
11
Код: CyBOSSeR 
int DigitCountGeniusIgnat(int number) {
  int result = 0;
  
  while (number != 0) {
    number /= 10;
    result++;
  }
 
  return result;
}
Manjak:
Ну и в чем проблемы, вот оформили в виде функции, достаточно одной строчки вызова и все.

Добавлено через 52 секунды
Это проще и лучше чем itoa + strlen
0
Evg
Эксперт CАвтор FAQ
18384 / 6432 / 441
Регистрация: 30.03.2009
Сообщений: 17,855
Записей в блоге: 28
03.05.2010, 12:06 #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Он еще по результатам теста в среднем в два раза быстрее на моей машине
Конкретно для данной постановки задачи мне было бы плевать на производительность. Пусть хоть в 100 раз быстрее, но я бы выбрал тот вариант, который проще.

Если немного пораскинуть мозгами, то вариант Manjak пост-фактум оказался более надёжным. Он свои проблемы переложил на чужие плечи (библиотечные функции) и чихал на всё. А при внимательном рассмотрении варианта через деление оказывается, что оно вернёт неправильный результат для нуля и отрицательных чисел. Т.е. теоретически угробилось лишнее время на отладку. А если неправильный результат вылился в неправильную работу с динамической памятью, то на поиск ошибки можно было бы ухлопать кучу времени
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
03.05.2010, 12:06 #18
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
std::generate(arr, arr + size, std::rand());
Вот за это спасибо - не знал!
0
Evg
Эксперт CАвтор FAQ
18384 / 6432 / 441
Регистрация: 30.03.2009
Сообщений: 17,855
Записей в блоге: 28
03.05.2010, 12:08 #19
Пока писал свой пост #14, то проглядел пост #13, а проблему с отрицательными числами там уже оказывается упомянули. Тем не менее для нуля программа уже работает неправильно

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ну и в чем проблемы, вот оформили в виде функции, достаточно одной строчки вызова и все.
Проблема не в конкретном решении данной задачи, а в методологии
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 12:14 #20
Цитата Сообщение от Evg Посмотреть сообщение
Тем не менее для нуля программа уже работает неправильно
Это исправляется просто:
C++
1
2
3
4
5
6
7
8
int DigitCount(int number) {
  int result = 1;
  
  while ((number /= 10) != 0) 
    result++;
 
  return result;
}
А вот, кстати, для отрицательных чисел минус учитывается или нет?

Добавлено через 53 секунды

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
Вот за это спасибо - не знал!
Всегда пожалуйста!

0
Evg
Эксперт CАвтор FAQ
18384 / 6432 / 441
Регистрация: 30.03.2009
Сообщений: 17,855
Записей в блоге: 28
03.05.2010, 12:35 #21
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Это исправляется просто
Сергей, 99% ошибок обладают тем свойством, что легко исправляются. Но далеко не все из них легко находятся. Особенно в больших программах. особенно когда программу пишет большая команда из дофига человек.

Методология (а не конкретное решение конкретной задачи) Manjak'а конкретно в данном случае оказалась более правильной. Ошибка, которую допустили в методе с делением, при подходе с стандартными функциями не проявилась бы по определению. Время, потраченное на реализацию, в обоих способах одинаковое (ибо и там и там всё решается парой строк). Но время на отладку в одном случае строго равно нулю, а в другом случае могло оказаться и фатально большим (в зависимости от конкретной программы, в которой бы решалась данная задача).
1
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
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;
        }
    }
}
Написан некрасиво, но у кого будет желание - перепишите покрасивее
0
easybudda
Модератор
Эксперт CЭксперт С++
9700 / 5650 / 964
Регистрация: 25.07.2009
Сообщений: 10,873
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 не выходят...
0
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;
}
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
03.05.2010, 13:03 #25
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:07 #26
Цитата Сообщение от M128K145 Посмотреть сообщение
Roma_F, более чем глупо. Вы расписали цикл линейно. Какой в этом смысл?
Какой смысл в твоём посте?
0
M128K145
Эксперт С++
8300 / 3520 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
03.05.2010, 13:16 #27
Roma_F, деление на 2 интервала и проверка уже только на одном из них. Ознакомьтесь http://ru.wikipedia.org/wiki/%D0%94%...BC%D0%B8%D1%8F
Я смогу определить что число длиной в 10 знаков уже на 3 шаге, а вы только на 10. Разницу чувствуете?
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 13:21 #28
M128K145, я имел в виду пост, который я процитировал

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

Я всего лишь предложил ещё один вариант - какой в этом смысл? - наверное мне нечем занятся, вот сижу и "постю"
0
Nike775
3 / 2 / 1
Регистрация: 01.04.2010
Сообщений: 30
03.05.2010, 13:21 #29
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 13:24 #30
Евгений, я согласен с тобой, что в случае, если по результатам выполнения изначального варианта с циклом для нуля будет выделяться память, то результат будет плачевным.
Но телодвижения с переводом числа в строку и подсчет ее длины, по моему мению, выглядят как то чуждо для данной задачи. Кроме того, если учесть необходимость обработки отрицательных чисел, то появяться дополнительные телодвижения, связанные с необходимостью избавления от знака.
Цитата Сообщение от Nike775 Посмотреть сообщение
блин а в чём вся проблема с минимальными знаниями её легко решить
хотябы через if()
Каким образом?
0
03.05.2010, 13:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 13:24
Привет! Вот еще темы с ответами:

Как в теле функции узнать длину передаваемого ей массива? - C++
Здравствуйте. Как могу в теле функции узнать длину передаваемого массива (для тела цикла)? Спасибо. #include &quot;stdafx.h&quot; #include...

Как узнать есть ли в массиве одинаковые числа и как найти эти числа ? - C++
Всем привет ,можете помочь как узнать есть ли в массиве одинаковые числа и как найти эти числа . Например массив с элементами 1 4 4 0 2 ....

Узнать длину границы - C++
Граница В международной политике важным понятием является граница между государствами. Нечеткое понимание сторонами того, где проходит...

Узнать длину строкового массива - C++
char s1; cout &lt;&lt; strlen(s1) &lt;&lt; endl; // Выдаёт 62 вместо 26| Как узнать char s2;// | правильный ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.