Вопрос

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

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

... но тогда я понял itoa Функция не стандартная. Есть ли другой способ сделать это?

Это было полезно?

Решение

(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 больше, чем число цифр правильно.)

- Джеймс Канзе.

Также возможно избежать преобразования в строку с помощью функции 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;
}

Я проверил его, и отлично работает (негативные номера - это особый случай). Кроме того, его необходимо учитывать, что, чтобы найти TTHE NT-Element, вы должны «пройти» в обратном направлении в цикле, вычитание от общего 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 и т. Д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top