Finding a Specific Digit of a Number

后端 未结 9 1888
深忆病人
深忆病人 2020-12-16 23:32

I\'m trying to find the nth digit of an integer of an arbitrary length. I was going to convert the integer to a string and use the character at index n...

相关标签:
9条回答
  • 2020-12-16 23:56

    It is also possible to avoid conversion to string by means of the function log10, int cmath, which returns the 10th-base logarithm of a number (roughly its length if it were a string):

    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;
    }
    

    I have tested it, and works perfectly well (negative numbers are a special case). Also, it must be taken into account that, in order to find tthe nth element, you have to "walk" backwards in the loop, subtracting from the total int length.

    Hope this helps.

    0 讨论(0)
  • 2020-12-17 00:00

    Itoa is in stdlib.h.

    You can also use an alternative itoa:
    Alternative to itoa() for converting integer to string C++?
    or
    ANSI C, integer to string without variadic functions

    0 讨论(0)
  • 2020-12-17 00:05

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

    just define the function intPower.

    0 讨论(0)
  • 2020-12-17 00:11

    You can use ostringstream to convert to a text string, but a function along the lines of:

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

    should do the trick with a lot less complications. (For starters, it handles the case where n is greater than the number of digits correctly.)

    -- James Kanze

    0 讨论(0)
  • 2020-12-17 00:12

    A more general approach:

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

    Just lets you do the same thing for different base numbers (e.g. 16, 32, 64, etc.).

    0 讨论(0)
  • 2020-12-17 00:15

    You can also use the % operator and / for integer division in a loop. (Given integer n >= 0, n % 10 gives the units digit, and n / 10 chops off the units digit.)

    0 讨论(0)
提交回复
热议问题