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

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

02.05.2010, 11:46. Показов 146211. Ответов 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
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
02.05.2010, 11:54
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <conio.h>
int main(){
int numb = 0;
int count = 0; 
printf("input numb\t");scanf("%d",&numb);
while(numb){
numb/=10;
count++;
}
int n = count;
printf("count numbers %d",n);
printf("\n");
return 0;
}
1
Быдлокодер
 Аватар для Darky
512 / 298 / 85
Регистрация: 22.11.2009
Сообщений: 892
02.05.2010, 11:57
Делить на 10, пока остаток от деления не будет равен 0.
2
 Аватар для Psixodelik
42 / 41 / 5
Регистрация: 27.11.2009
Сообщений: 100
02.05.2010, 12:01  [ТС]
Всем спасибо))
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
02.05.2010, 12:10
А сделать из числа строку и просто длину строки вывести не проще?
0
 Аватар для ForestG
39 / 39 / 9
Регистрация: 21.11.2009
Сообщений: 201
03.05.2010, 02:59
Manjak, Согласен
0
03.05.2010, 03:06

Не по теме:

можно еще вывести на экран и посчитать на сколько знаков сместилась каретка ввода :D

0
 Аватар для Norby
66 / 66 / 5
Регистрация: 12.03.2008
Сообщений: 392
03.05.2010, 03:18
Цитата Сообщение от Vorona Посмотреть сообщение

Не по теме:

можно еще вывести на экран и посчитать на сколько знаков сместилась каретка ввода :D

Не по теме:

Это для изврещенных умов ассемблероманов :D

0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 08:35
Цитата Сообщение от Manjak Посмотреть сообщение
А сделать из числа строку и просто длину строки вывести не проще?
Сначала перевести в строку, потом посчитать ее длину. Чем же проще, то?
0
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 10:19
В чем проблема?
C
1
2
3
4
5
    char buffer[65];
    int r = 12345;
    int base = 10;
    _itoa_s( r, buffer, base );
    printf( "base %d: %s (%d chars)\n", base, buffer, strnlen(buffer, _countof(buffer)) );
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 11:28
Manjak:
Проще: если есть примочка в виде библиотечного велосипеда.
В плане того что твое предложение быстрее я сомневаюсь,
но в принципе тут скорость не особо важна.
1
 Аватар для Manjak
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 11:38
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Конечно, там можно и побыстрее сделать, например, не использовать safe функции.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
03.05.2010, 11:45
Цитата Сообщение от Manjak Посмотреть сообщение
А сделать из числа строку и просто длину строки вывести не проще?
У этого способа есть ещё один тонкий момент - если число отрицательное, нужно либо удалять первый символ, либо отнимать единицу от результата, ну или ещё как-нибудь выкручиваться. Если на этом не заморачиваться, то можно вот так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <sstream>
 
int main(){
    unsigned long num;
    std::cout << "Number: ";
    std::cin >> num;
    std::ostringstream ost;
    ost << num;
    std::cout << ost.str().size() << " digits." << std::endl;
    
    return 0;
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.05.2010, 11:46
Цитата Сообщение от Manjak Посмотреть сообщение
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Скажем так, нужно просто чётко разделять те места, где код должен быть быстрым, а где необязательно. Постановка задачи из данной темы маловероятно нужна в кодах, критичных к производительности. Однако код через деление выглядит прсотым до банальности, а потому я бы выбрал именно его
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 11:50
Цитата Сообщение от Evg Посмотреть сообщение
Однако код через деление выглядит прсотым до банальности, а потому я бы выбрал именно его
Он еще по результатам теста в среднем в два раза быстрее на моей машине.
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
44
45
46
47
48
49
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
int DigitCountGeniusIgnat(int number) {
  int result = 0;
  
  while (number != 0) {
    number /= 10;
    result++;
  }
 
  return result;
}
 
int DigitCountManjak(int number) {
  char buffer[65];
  int base = 10;
 
  itoa(number, buffer, base);
 
  return strnlen(buffer, _countof(buffer))
}
 
typedef int (*func_ptr)(int);
 
double Duration(const int* arr, int size, func_ptr func) {
  const std::clock_t start = std::clock();
 
  for (int i = 0; i < size; ++i)
    int count = func(arr[i]);
 
  const std::clock_t finish = std::clock();
 
  return static_cast<double>(finish - start) / CLOCK_PER_SEC;
}
 
int main() {
  const int  size = 1000000;
        int* arr  = new int[size];
 
  std::generate(arr, arr + size, std::rand());
 
  std::cout << "DigitCountGeniusIgnat duration: " << Duration(arr, size, DigitCountGeniusIgnat) << std::endl;
  std::cout << "DigitCountManjak duration: "      << Duration(arr, size, DigitCountManjak     ) << std::endl;
  
  return 0;
}
2
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 12:03
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
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.05.2010, 12:06
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Он еще по результатам теста в среднем в два раза быстрее на моей машине
Конкретно для данной постановки задачи мне было бы плевать на производительность. Пусть хоть в 100 раз быстрее, но я бы выбрал тот вариант, который проще.

Если немного пораскинуть мозгами, то вариант Manjak пост-фактум оказался более надёжным. Он свои проблемы переложил на чужие плечи (библиотечные функции) и чихал на всё. А при внимательном рассмотрении варианта через деление оказывается, что оно вернёт неправильный результат для нуля и отрицательных чисел. Т.е. теоретически угробилось лишнее время на отладку. А если неправильный результат вылился в неправильную работу с динамической памятью, то на поиск ошибки можно было бы ухлопать кучу времени
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
03.05.2010, 12:06
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
std::generate(arr, arr + size, std::rand());
Вот за это спасибо - не знал!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
03.05.2010, 12:08
Пока писал свой пост #14, то проглядел пост #13, а проблему с отрицательными числами там уже оказывается упомянули. Тем не менее для нуля программа уже работает неправильно

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ну и в чем проблемы, вот оформили в виде функции, достаточно одной строчки вызова и все.
Проблема не в конкретном решении данной задачи, а в методологии
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 12:14
Цитата Сообщение от 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 Посмотреть сообщение
Вот за это спасибо - не знал!
Всегда пожалуйста!

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2010, 12:14
Помогаю со студенческими работами здесь

Как узнать длину указателя (в байтах)?
как узнать длину указателя(в байтах) 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 *; Потом каждому столбцу выделаю разное...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru