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

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

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

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

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

Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
Лучшие ответы (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="проверка"; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Genius Ignat
1236 / 774 / 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++
2300 / 1670 / 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
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
03.05.2010, 13:31 #34
Genius Ignat, это уже не программирование, а математика
Дело в подходе. Надо с самого начала привыкать писать что-то более-менее оправданное с точки зрения алгоритма, иначе все уравнения сейчас решались бы методом полного перебора и дихотомию бы не изобрели(а также золотого сечения, у них смысл один и тот же, только коефициенты разные). Согласитесь, это простая модель, а если ее перенести на более сложную? И действие - не деление, а вычисления уравнения 4 порядка с просчетом производных всех 3 степеней по всем переменным?

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

Добавлено через 4 минуты
CyBOSSeR, можете расценивать как попытку выкрутится(но не везде сработает)
C++
1
#define int long
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;
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 14:18 #40
Не большой итог теме:
Оба способа деление /10 и itoa + strlen приемлемы, и дело не в быстродействии,
а просто в решении задачи поставленной задачи.
Просто деление: это скорее всего то что ожидает увидеть преподаватель...
В любом случае все рассмотренные способы, автору могут пригодиться...
Darky
Быдлокодер
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
03.05.2010, 16:01 #41
CyBOSSeR,

Не по теме:

Прошу прощения, товарищ, на чем пишете? Билдер и Борланд не захотели std::generate

CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 17:37 #42

Не по теме:

Darky, MSVS 2008. Проверь, подключен ли <algorithm>. Если да, то дело скорее вего в Builder

.
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
03.05.2010, 17:59 #43
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Darky Посмотреть сообщение
Билдер и Борланд не захотели std::generate
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <time.h>
size_t f( int x)
{
    return log10(x)+1;
}
int main()//=========================================================
{
    std::srand( std::time(0) );
    std::vector<int> v(100);
 
    std::generate(v.begin(), v.end(), std::rand);
 
    for (size_t i = 0; i < v.size(); ++i)
    std::cout << v.at(i) << " | " << f(v.at(i)) << std::endl;
 
    return 0;
}//==================================================================
easybudda
Модератор
Эксперт CЭксперт С++
9530 / 5523 / 932
Регистрация: 25.07.2009
Сообщений: 10,608
03.05.2010, 18:17 #44
mirso, при числах < 1 забавные результаты выдаёт, а вообще спасибо, интересно...
mirso
525 / 343 / 17
Регистрация: 05.04.2009
Сообщений: 709
03.05.2010, 21:30 #45
Цитата Сообщение от easybudda Посмотреть сообщение
а вообще спасибо, интересно...
Пожалуйста!

Цитата Сообщение от easybudda Посмотреть сообщение
при числах < 1 забавные результаты выдаёт
easybudda, а так?
C++
1
2
3
4
5
    int a = -1, b = -22, c = -333;
    std::cout << 0 << " | " << f( abs(0) ) << std::endl;
    std::cout << a << " | " << f( abs(a) ) << std::endl;
    std::cout << b << " | " << f( abs(b) ) << std::endl;
    std::cout << c << " | " << f( abs(c) ) << std::endl;
Цитата Сообщение от Psixodelik Посмотреть сообщение
как можно узнать длину числа(колличество цифр в нём)?
Ноль - это цифра?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 21:30
Привет! Вот еще темы с ответами:

Как в теле функции узнать длину передаваемого ей массива? - 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;// | правильный ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.05.2010, 21:30
Ответ Создать тему
Опции темы

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