Поиск определенной цифры числа
Я пытаюсь найти n
- Я цифра целого числа произвольной длины. Я собирался преобразовать целое число в строку и использовать символ в индексе n...
char Digit = itoa(Number).at(n);
...Но затем я понял
9 ответов
вы также можете использовать оператор % и / для целочисленного деления в цикле. (Заданное целое число n >= 0, n % 10 дает цифру единиц, а n/10 отсекает цифру единиц.)
вы можете использовать ostringstream для преобразования в текстовую строку, но функция по строкам:
char nthDigit(unsigned v, int n)
{
while ( n > 0 ) {
v /= 10;
-- n;
}
return "0123456789"[v % 10];
}
должен сделать трюк с гораздо меньшими осложнениями. (Для во-первых, он обрабатывает случай, когда n больше, чем число цифр правильно.)
-- James Kanze
Itoa находится в stdlib.h.
вы также можете использовать альтернативный itoa:
альтернатива itoa () для преобразования целого числа в строку c++?
или
ANSI с, integer в String без variadic функции
также можно избежать преобразования в строку с помощью функции 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>
библиотека
number = 123456789
n = 5
tmp1 = (int)(number / 10^n); // tmp1 = 12345
tmp2 = ((int)(tmp1/10))*10; // tmp2 = 12340
digit = tmp1 - tmp2; // digit = 5
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 и т. д.).