Нахождение определенной цифры номера - PullRequest
8 голосов
/ 10 декабря 2010

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

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

... Но потом я понял, что функция itoa не является стандартной. Есть ли другой способ сделать это?

Ответы [ 9 ]

17 голосов
/ 10 декабря 2010

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

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

3 голосов
/ 10 декабря 2010

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

1 голос
/ 10 декабря 2010

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

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

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

1 голос
/ 10 декабря 2010

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

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 length .

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

1 голос
/ 10 декабря 2010

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

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

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

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

1 голос
/ 10 декабря 2010
number = 123456789
n = 5

tmp1 = (int)(number / 10^n);   // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10;    // tmp2 = 12340
digit = tmp1 - tmp2;           // digit = 5
1 голос
/ 10 декабря 2010

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

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

0 голосов
/ 10 декабря 2010

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

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

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

0 голосов
/ 10 декабря 2010
const char digit = '0' + number.at(n);

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

...