我试图找到n
任意长度的整数的第 th 位。我打算将整数转换为字符串并使用索引 n 处的字符...
char Digit = itoa(Number).at(n);
...但后来我意识到这个itoa
功能不是标准的。有没有其他方法可以做到这一点?
(number/intPower(10, n))%10
只需定义函数intPower
。
您还可以在循环中使用 % 运算符和 / 进行整数除法。(给定整数 n >= 0,n % 10 给出个位,n / 10 去掉个位。)
Itoa 在 stdlib.h 中。
您还可以使用替代 itoa:
替代 itoa() 将整数转换为字符串 C++?
或
ANSI C,整数到字符串,不带可变参数函数
number = 123456789
n = 5
tmp1 = (int)(number / 10^n); // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10; // tmp2 = 12340
digit = tmp1 - tmp2; // digit = 5
您可以使用 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;
}
我已经对其进行了测试,并且效果很好(负数是一种特殊情况)。此外,必须考虑到,为了找到第 n 个元素,您必须在循环中向后“走”,从总 int长度中减去。
希望这可以帮助。
一个直接的答案是:
char Digit = 48 + ((int)(Number/pow(10,N)) % 10 );
你应该包括<math>
图书馆
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 等)执行相同的操作。
一种替代方法itoa
是std::to_string
方法。所以,你可以简单地做:
char digit = to_string(number)[index]