Поиск определенной цифры числа

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

char Digit = itoa(Number).at(n);

...Но затем я понял

9 ответов


(number/intPower(10, n))%10

просто определите функцию intPower.


вы также можете использовать оператор % и / для целочисленного деления в цикле. (Заданное целое число n >= 0, n % 10 дает цифру единиц, а n/10 отсекает цифру единиц.)


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

char nthDigit(unsigned v, int n)
{
    while ( n > 0 ) {
        v /= 10;
        -- n;
    }
    return "0123456789"[v % 10];
}

должен сделать трюк с гораздо меньшими осложнениями. (Для во-первых, он обрабатывает случай, когда n больше, чем число цифр правильно.)

-- James Kanze


Itoa находится в stdlib.h.

вы также можете использовать альтернативный itoa:
альтернатива itoa () для преобразования целого числа в строку c++?
или
ANSI с, integer в String без variadic функции


также можно избежать преобразования в строку с помощью функции log10 коп, int cmath, который возвращает логарифм числа с 10-й базой (примерно его длину, если это строка):

unsigned int getIntLength(int x)
{
    if ( x == 0 )
            return 1;
    else    return std::log10( std::abs( x ) ) +1;
}

char getCharFromInt(int n, int x)
{
    char toret = 0;
    x = std::abs( x );
    n = getIntLength( x ) - n -1;

    for(; n >= 0; --n) {
        toret = x % 10;
        x /= 10;
    }

    return '0' + toret;
}

я протестировал его и отлично работает (отрицательные числа являются частным случаем). Кроме того, необходимо учитывать, что для того, чтобы найти n-й элемент, вы должны" ходить " назад по циклу, вычитая из общего int длина.

надеюсь, что это помогает.


прямой ответ:

char Digit = 48 + ((int)(Number/pow(10,N)) % 10 );

вы должны включить <math> библиотека


number = 123456789
n = 5

tmp1 = (int)(number / 10^n);   // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10;    // tmp2 = 12340
digit = tmp1 - tmp2;           // digit = 5

const char digit = '0' + number.at(n);

предполагая, что number.at(n) возвращает десятичную цифру в диапазоне 0...9, что является.


более общий подход:

template<int base>
int nth_digit(int value, int digit)
{
    return (value / (int)pow((double)base, digit)) % base;
}

просто позволяет делать то же самое для разных базовых чисел (например, 16, 32, 64 и т. д.).