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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 179, средняя оценка - 4.66
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
02.05.2010, 11:46     Как узнать длину числа? #1
Всем привет Интересует такой вопрос: как можно узнать длину числа(колличество цифр в нём)? Т.е. записать длину в отдельную переменную. К примеру a = 124; и как скажем в переменную buf занести тогда число 3 и т.д.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
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;
}
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
02.05.2010, 11:57     Как узнать длину числа? #3
Делить на 10, пока остаток от деления не будет равен 0.
Psixodelik
 Аватар для Psixodelik
38 / 37 / 2
Регистрация: 27.11.2009
Сообщений: 93
02.05.2010, 12:01  [ТС]     Как узнать длину числа? #4
Всем спасибо))
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
02.05.2010, 12:10     Как узнать длину числа? #5
А сделать из числа строку и просто длину строки вывести не проще?
ForestG
 Аватар для ForestG
32 / 32 / 3
Регистрация: 21.11.2009
Сообщений: 201
03.05.2010, 02:59     Как узнать длину числа? #6
Manjak, Согласен
Vorona
03.05.2010, 03:06
  #7

Не по теме:

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

Norby
 Аватар для Norby
64 / 64 / 2
Регистрация: 12.03.2008
Сообщений: 392
03.05.2010, 03:18     Как узнать длину числа? #8
Цитата Сообщение от Vorona Посмотреть сообщение

Не по теме:

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

Не по теме:

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

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.05.2010, 08:35     Как узнать длину числа? #9
Цитата Сообщение от Manjak Посмотреть сообщение
А сделать из числа строку и просто длину строки вывести не проще?
Сначала перевести в строку, потом посчитать ее длину. Чем же проще, то?
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 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)) );
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 11:28     Как узнать длину числа? #11
Manjak:
Проще: если есть примочка в виде библиотечного велосипеда.
В плане того что твое предложение быстрее я сомневаюсь,
но в принципе тут скорость не особо важна.
Manjak
 Аватар для Manjak
269 / 175 / 7
Регистрация: 12.03.2010
Сообщений: 494
03.05.2010, 11:38     Как узнать длину числа? #12
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Конечно, там можно и побыстрее сделать, например, не использовать safe функции.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
03.05.2010, 11:46     Как узнать длину числа? #14
Цитата Сообщение от Manjak Посмотреть сообщение
Не всегда в быстродействии счастье Код в первую очередь должен быть понятным.
Скажем так, нужно просто чётко разделять те места, где код должен быть быстрым, а где необязательно. Постановка задачи из данной темы маловероятно нужна в кодах, критичных к производительности. Однако код через деление выглядит прсотым до банальности, а потому я бы выбрал именно его
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 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;
}
Genius Ignat
1233 / 771 / 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
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
03.05.2010, 12:06     Как узнать длину числа? #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Он еще по результатам теста в среднем в два раза быстрее на моей машине
Конкретно для данной постановки задачи мне было бы плевать на производительность. Пусть хоть в 100 раз быстрее, но я бы выбрал тот вариант, который проще.

Если немного пораскинуть мозгами, то вариант Manjak пост-фактум оказался более надёжным. Он свои проблемы переложил на чужие плечи (библиотечные функции) и чихал на всё. А при внимательном рассмотрении варианта через деление оказывается, что оно вернёт неправильный результат для нуля и отрицательных чисел. Т.е. теоретически угробилось лишнее время на отладку. А если неправильный результат вылился в неправильную работу с динамической памятью, то на поиск ошибки можно было бы ухлопать кучу времени
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.05.2010, 12:06     Как узнать длину числа? #18
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
std::generate(arr, arr + size, std::rand());
Вот за это спасибо - не знал!
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
03.05.2010, 12:08     Как узнать длину числа? #19
Пока писал свой пост #14, то проглядел пост #13, а проблему с отрицательными числами там уже оказывается упомянули. Тем не менее для нуля программа уже работает неправильно

Цитата Сообщение от Genius Ignat Посмотреть сообщение
Ну и в чем проблемы, вот оформили в виде функции, достаточно одной строчки вызова и все.
Проблема не в конкретном решении данной задачи, а в методологии
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 12:14     Как узнать длину числа?
Еще ссылки по теме:

Как узнать длину строки, содержащей кириллицу? C++
C++ Как узнать длину указателя (в байтах)?
C++ Как узнать длину строки TCHAR?

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 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 Посмотреть сообщение
Вот за это спасибо - не знал!
Всегда пожалуйста!

Yandex
Объявления
03.05.2010, 12:14     Как узнать длину числа?
Ответ Создать тему
Опции темы

Текущее время: 16:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru