Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/308: Рейтинг темы: голосов - 308, средняя оценка - 4.76
40 / 39 / 5
Регистрация: 27.11.2009
Сообщений: 100
1

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

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

Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2010, 11:46
Ответы с готовыми решениями:

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

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

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

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

44
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
02.05.2010, 11:54 2
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
Быдлокодер
510 / 297 / 84
Регистрация: 22.11.2009
Сообщений: 892
02.05.2010, 11:57 3
Делить на 10, пока остаток от деления не будет равен 0.
2
40 / 39 / 5
Регистрация: 27.11.2009
Сообщений: 100
02.05.2010, 12:01  [ТС] 4
Всем спасибо))
0
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
02.05.2010, 12:10 5
А сделать из числа строку и просто длину строки вывести не проще?
0
39 / 39 / 9
Регистрация: 21.11.2009
Сообщений: 201
03.05.2010, 02:59 6
Manjak, Согласен
0
Vorona
03.05.2010, 03:06
  #7

Не по теме:

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

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

Не по теме:

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

Не по теме:

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

0
Эксперт С++
2329 / 1702 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 08:35 9
Цитата Сообщение от Manjak Посмотреть сообщение
А сделать из числа строку и просто длину строки вывести не проще?
Сначала перевести в строку, потом посчитать ее длину. Чем же проще, то?
0
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 10:19 10
В чем проблема?
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
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 11:28 11
Manjak:
Проще: если есть примочка в виде библиотечного велосипеда.
В плане того что твое предложение быстрее я сомневаюсь,
но в принципе тут скорость не особо важна.
1
270 / 176 / 46
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 11:38 12
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Конечно, там можно и побыстрее сделать, например, не использовать safe функции.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10855 / 6728 / 1616
Регистрация: 25.07.2009
Сообщений: 12,468
03.05.2010, 11:45 13
Цитата Сообщение от 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
21130 / 8146 / 628
Регистрация: 30.03.2009
Сообщений: 22,459
Записей в блоге: 30
03.05.2010, 11:46 14
Цитата Сообщение от Manjak Посмотреть сообщение
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Скажем так, нужно просто чётко разделять те места, где код должен быть быстрым, а где необязательно. Постановка задачи из данной темы маловероятно нужна в кодах, критичных к производительности. Однако код через деление выглядит прсотым до банальности, а потому я бы выбрал именно его
0
Эксперт С++
2329 / 1702 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 11:50 15
Цитата Сообщение от 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
1257 / 795 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
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
21130 / 8146 / 628
Регистрация: 30.03.2009
Сообщений: 22,459
Записей в блоге: 30
03.05.2010, 12:06 17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Он еще по результатам теста в среднем в два раза быстрее на моей машине
Конкретно для данной постановки задачи мне было бы плевать на производительность. Пусть хоть в 100 раз быстрее, но я бы выбрал тот вариант, который проще.

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

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ну и в чем проблемы, вот оформили в виде функции, достаточно одной строчки вызова и все.
Проблема не в конкретном решении данной задачи, а в методологии
0
Эксперт С++
2329 / 1702 / 148
Регистрация: 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 Посмотреть сообщение
Вот за это спасибо - не знал!
Всегда пожалуйста!

1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2010, 12:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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

Как в теле функции узнать длину передаваемого ей массива?
Здравствуйте. Как могу в теле функции узнать длину передаваемого массива (для тела цикла)? Спасибо....

Как узнать есть ли в массиве одинаковые числа и как найти эти числа ?
Всем привет ,можете помочь как узнать есть ли в массиве одинаковые числа и как найти эти числа ....


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

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

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