С++ - как найти длину целого числа

Я пытаюсь найти способ найти длину целого числа (количество цифр), а затем поместить его в массив целых чисел. Задание также требует сделать это без использования классов из STL, хотя в спецификации программы говорится, что мы можем использовать «общие библиотеки C» (собираюсь спросить моего профессора, могу ли я использовать cmath, потому что я предполагаю, что log10 (число) +1 самый простой способ, но мне было интересно, есть ли другой способ).

Ах, и это не должно обрабатывать отрицательные числа. Только неотрицательные числа.

Я пытаюсь создать вариант класса MyInt, который может обрабатывать более широкий диапазон значений с использованием динамического массива. Любые советы будут оценены! Спасибо!


person user1888527    schedule 26.03.2014    source источник
comment
@KerrekSB На самом деле я думаю, что он имеет в виду общее значение без знака. Это будет 2 в степени ( sizeof( int ) * 8 - 1 ), верно? РЕДАКТИРОВАТЬ: Неважно.   -  person Ben    schedule 26.03.2014
comment
Количество цифр в десятичном целом равно (лог(число)/лог(10)).   -  person Thomas Matthews    schedule 26.03.2014
comment
Не изобретайте велосипед, используйте библиотеку больших чисел. Найдите в Интернете библиотеку больших чисел С++.   -  person Thomas Matthews    schedule 26.03.2014
comment
Спасибо за подсказку, Томас, но на самом деле это задание для класса и небольшая задача по программированию для новичка!   -  person user1888527    schedule 26.03.2014


Ответы (15)


Количество цифр целого числа n в любом основании тривиально получается путем деления, пока вы не закончите:

unsigned int number_of_digits = 0;

do {
     ++number_of_digits; 
     n /= base;
} while (n);
person Kerrek SB    schedule 26.03.2014
comment
Нет причин использовать это решение, поскольку решения на основе log10 намного лучше. - person tleb; 09.01.2020
comment
@tleb: лучше в каком смысле? Вы сравнивали два подхода? - person Kerrek SB; 09.01.2020
comment
Как это лучше, чем решение log10, но предпочел бы более явное while (n != 0) для удобочитаемости. Тем не менее, стоит проголосовать. - person paxdiablo; 23.05.2021

Не обязательно самый эффективный, но один из самых коротких и читаемых с использованием C++:

std::to_string(num).length()
person Riot    schedule 09.02.2016
comment
@Zammbi вопрос буквально гласит, что ему не нужно обрабатывать отрицательные числа. - person Riot; 27.02.2018
comment
и это решение соответствует этому требованию. Он дополнительно обрабатывает отрицательные числа. хD - person smsware; 08.04.2021

Есть гораздо лучший способ сделать это

    #include<cmath>
    ...
    int size = trunc(log10(num)) + 1
....

работает для целых и десятичных чисел

person kunz    schedule 04.08.2017
comment
Мне это нравится (отсюда и плюс), просто, к сожалению, это не работает для числа ноль ... - person Abdel Aleem; 20.08.2020

Если вы можете использовать библиотеки C, то одним из способов будет использование sprintf, например

#include <cstdio>

char s[32];

int len = sprintf(s, "%d", i);
person Paul R    schedule 26.03.2014
comment
Вы можете использовать snprintf(nullptr, 0, %d, i) ;` и не нужно s. - person Tony Delroy; 26.03.2014
comment
Это также не будет работать для 128-битных целых чисел. Решение nullptr от @Tony исправит это. - person paxdiablo; 23.05.2021

"Я имею в виду количество цифр в целом числе, например, "123" имеет длину 3"

int i = 123;

// the "length" of 0 is 1:
int len = 1;

// and for numbers greater than 0:
if (i > 0) {
    // we count how many times it can be divided by 10:
    // (how many times we can cut off the last digit until we end up with 0)
    for (len = 0; i > 0; len++) {
        i = i / 10;
    }
}

// and that's our "length":
std::cout << len;

выходы 3

person LihO    schedule 26.03.2014

Закрытая формула для самого длинного int (здесь я использовал int, но работает для любого целочисленного типа со знаком):

1 + (int) ceil((8*sizeof(int)-1) * log10(2))

Объяснение:

                  sizeof(int)                 // number bytes in int
                8*sizeof(int)                 // number of binary digits (bits)
                8*sizeof(int)-1               // discount one bit for the negatives
               (8*sizeof(int)-1) * log10(2)   // convert to decimal, because:
                                              // 1 bit == log10(2) decimal digits
    (int) ceil((8*sizeof(int)-1) * log10(2))  // round up to whole digits
1 + (int) ceil((8*sizeof(int)-1) * log10(2))  // make room for the minus sign

Для типа int из 4 байтов результат равен 11. Пример 4 байтов int с 11 десятичными цифрами: "-2147483648".

Если вам нужно количество десятичных цифр некоторого значения int, вы можете использовать следующую функцию:

unsigned base10_size(int value)
{
    if(value == 0) {
        return 1u;
    }

    unsigned ret;
    double dval;
    if(value > 0) {
        ret = 0;
        dval = value;
    } else {
        // Make room for the minus sign, and proceed as if positive.
        ret = 1;
        dval = -double(value);
    }

    ret += ceil(log10(dval+1.0));

    return ret;
}

Я протестировал эту функцию для всего диапазона int в g++ 9.3.0 для x86-64.

person lvella    schedule 18.05.2015
comment
ceil(log10(var+1)) завершится ошибкой для INT_MAX - person bricklore; 28.07.2016
comment
Это ненадежно, максимальное значение типа не удастся. Полностью согласен с Бриклором. Я предпочитаю std::to_string(num).length(), как сказал Riot. - person 123iamking; 21.08.2017
comment
Проблема с INT_MAX была устранена путем преобразования в double перед добавлением 1. - person lvella; 10.06.2020

Будучи компьютерным ботаником, а не знатоком математики, я бы сделал:

char buffer[64];
int len = sprintf(buffer, "%d", theNum);
person John3136    schedule 26.03.2014
comment
Который эффектно рухнет, когда станут доступны 256-битные целые числа :-) - person paxdiablo; 23.05.2021

int intLength(int i) {
    int l=0;
    for(;i;i/=10) l++;
    return l==0 ? 1 : l;
}

Вот крошечный эффективный

person Naheel    schedule 08.12.2015
comment
вы должны сохранить случай i == 0. который также равен 1, а текущая функция возвращает 0; - person sergio; 08.02.2016

Будет ли это эффективным подходом? Преобразование в строку и поиск свойства длины?

int num = 123  
string strNum = to_string(num); // 123 becomes "123"
int length = strNum.length(); // length = 3
char array[3]; // or whatever you want to do with the length
person Aris94    schedule 10.04.2015
comment
Хотя и не очень эффективно. - person ranu; 21.04.2017

Как насчет (работает также для 0 и негативов):

int digits( int x ) { 
    return ( (bool) x * (int) log10( abs( x ) ) + 1 );
}
person Sir Alucard    schedule 10.12.2017

Лучший способ найти с помощью журнала, он работает всегда

int len = ceil(log10(num))+1;
person suraz negi    schedule 13.05.2018
comment
Для num==50 log10(50) ~= 1,7, ceil(1,7) = 2 плюс 1 дает 3. Округление с помощью ceil является неправильным подходом. - person Paul Floyd; 26.09.2019
comment
Вы должны урезать вместо округления - person Abdel Aleem; 20.08.2020

Код для нахождения длины int и десятичного числа:

#include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
        int len,num;
        cin >> num;
        len = log10(num) + 1;
        cout << len << endl;
        return 0;
    }
    //sample input output
    /*45566
    5

    Process returned 0 (0x0)   execution time : 3.292 s
    Press any key to continue.
    */
person Tanim_113    schedule 07.04.2018

Нет встроенных функций ни в C/C++, ни в STL для нахождения длины целого числа, но есть несколько способов, с помощью которых ее можно найти
Вот пример кода C++ для нахождения длины целого числа , его можно записать в функцию для повторного использования.

#include<iostream>
using namespace std;

int main()
{
  long long int n;
  cin>>n;
  unsigned long int integer_length = 0;

  while(n>0)
  {    
   integer_length++;
   n = n/10; 
  }
 
  cout<<integer_length<<endl;

 return 0;
}

Вот еще один способ: преобразовать целое число в строку и найти длину, он выполняет то же самое с помощью одной строки:

#include<iostream>
#include<cstring>
using namespace std;

    int main()
    {
        long long int n;
    cin>>n;
    unsigned long int integer_length = 0;
    
    // convert to string
    integer_length = to_string(n).length();
    
    cout<<integer_length<<endl;

    return 0;
    }

Примечание. Обязательно включите заголовочный файл cstring

person Saptarshi das    schedule 02.03.2021

Самый простой способ:

#include <string> 

int int_length = to_string(42).length();
person Abolfazl Mohajeri    schedule 15.06.2021

Самый эффективный код для определения длины числа.. также считает нули, обратите внимание, что «n» - это число, которое нужно указать.

#include <iostream>
using namespace std;
int main()
{
    int n,len= 0;
    cin>>n;
while(n!=0)
    {
       len++;
       n=n/10;
    }
    cout<<len<<endl;
    return 0;
}
person apex predator    schedule 26.09.2019
comment
Это не дает ничего, что не дает принятый ответ. - person Raedwald; 26.09.2019
comment
да. Уже 14 ответов, и это ничем не отличается от многих из них. - person Paul Floyd; 26.09.2019