查找数字的特定数字

发布于 2024-10-07 04:51:02 字数 174 浏览 7 评论 0原文

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

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

...但是后来我意识到 itoa 函数不是标准的。还有其他方法可以做到这一点吗?

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

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

...But then I realized the itoa function isn't standard. Is there any other way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

赏烟花じ飞满天 2024-10-14 04:51:02

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

只需定义函数intPower

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

just define the function intPower.

小糖芽 2024-10-14 04:51:02

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

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

半步萧音过轻尘 2024-10-14 04:51:02

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

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

应该能够以更少的复杂性完成任务。 (为了
首先,它处理 n 大于数字的情况
正确的数字。)

--
詹姆斯·坎泽

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

我要还你自由 2024-10-14 04:51:02

还可以通过函数 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 length 中减去。

希望这有帮助。

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.

溺ぐ爱和你が 2024-10-14 04:51:02

直接的答案是:

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

您应该包含

A direct answer is:

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

You should include the <math> library

兔姬 2024-10-14 04:51:02
number = 123456789
n = 5

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

tmp1 = (int)(number / 10^n);   // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10;    // tmp2 = 12340
digit = tmp1 - tmp2;           // digit = 5
爱她像谁 2024-10-14 04:51:02
const char digit = '0' + number.at(n);

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

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

Assuming number.at(n) returns a decimal digit in the range 0...9, that is.

我三岁 2024-10-14 04:51:02

更通用的方法:

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

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

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

总以为 2024-10-14 04:51:02

itoa 的替代方案是 std: :to_string 方法。所以,你可以简单地这样做:

char digit = to_string(number)[index]

An alternative to itoa is the std::to_string method. So, you could simply do:

char digit = to_string(number)[index]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文