8

我试图找到n任意长度的整数的第 th 位。我打算将整数转换为字符串并使用索引 n 处的字符...

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

...但后来我意识到这个itoa功能不是标准的。有没有其他方法可以做到这一点?

4

10 回答 10

21

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

只需定义函数intPower

于 2010-12-10T15:58:41.027 回答
4

您还可以在循环中使用 % 运算符和 / 进行整数除法。(给定整数 n >= 0,n % 10 给出个位,n / 10 去掉个位。)

于 2010-12-10T16:01:34.830 回答
1

Itoa 在 stdlib.h 中。

您还可以使用替代 itoa:
替代 itoa() 将整数转换为字符串 C++?

ANSI C,整数到字符串,不带可变参数函数

于 2010-12-10T15:58:17.987 回答
1
number = 123456789
n = 5

tmp1 = (int)(number / 10^n);   // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10;    // tmp2 = 12340
digit = tmp1 - tmp2;           // digit = 5
于 2010-12-10T16:02:08.940 回答
1

您可以使用 ostringstream 转换为文本字符串,但可以使用以下函数:

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

应该以更少的并发症来解决问题。(对于初学者来说,它会正确处理 n 大于位数的情况。)

——詹姆斯·坎泽

于 2010-12-10T16:06:35.733 回答
1

也可以通过函数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长度中减去。

希望这可以帮助。

于 2010-12-10T16:25:40.647 回答
1

一个直接的答案是:

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

你应该包括<math>图书馆

于 2010-12-10T16:51:26.417 回答
0
const char digit = '0' + number.at(n);

假设number.at(n)返回 0...9 范围内的十进制数字,即。

于 2010-12-10T15:57:38.240 回答
0

更通用的方法:

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

只是让您对不同的基数(例如 16、32、64 等)执行相同的操作。

于 2010-12-10T18:16:02.760 回答
0

一种替代方法itoastd::to_string方法。所以,你可以简单地做:

char digit = to_string(number)[index]
于 2021-08-14T08:31:59.700 回答