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

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

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

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

13 ответов


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

unsigned int number_of_digits = 0;

do {
     ++number_of_digits; 
     n /= base;
} while (n);

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

std::to_string(num).length()

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

#include <cstdio>

char s[32];

int len = sprintf(s, "%d", i);

" Я имею в виду количество цифр в целом, т. е. "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


закрытая формула для размера int:

ceil(8*sizeof(int) * log10(2))

EDIT:

для количества десятичных цифр некоторого значения:

ceil(log10(var+1))

это работает для чисел > 0. Ноль должен проверяться отдельно.


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

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


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

char buffer[64];
int len = sprintf(buffer, "%d", theNum);

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

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

работает для int и decimal


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

int digits( int x ) { 
    return ( (bool) x * (int) log10( abs( x ) ) + 1 );
}

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

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

код для поиска длины 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.
    */

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

int len = ceil(log10(num))+1;

простая и довольно простая функция

int intlen(int i)
    {
    int j=1;
    while(i>10){i=i/10;j++;}
    return j;
    }