Trouver un chiffre spécifique d'un numéro
Question
Je suis en train de trouver le chiffre n
th d'un nombre entier d'une longueur arbitraire. J'allais convertir l'entier en chaîne et utiliser le caractère à l'index n ...
char Digit = itoa(Number).at(n);
... Mais je me suis rendu la fonction itoa
n'est pas standard. Est-il une autre façon de le faire?
La solution
(number/intPower(10, n))%10
juste définir la fonction intPower
.
Autres conseils
Vous pouvez également utiliser l'opérateur% et / pour la division entière dans une boucle. (Nombre entier donné N> = 0, n% 10 donne le chiffre des unités, et N / 10 côtelettes au large de la position des unités.)
Vous pouvez utiliser ostringstream pour convertir en une chaîne de texte, mais une fonction le long des lignes de:
char nthDigit(unsigned v, int n)
{
while ( n > 0 ) {
v /= 10;
-- n;
}
return "0123456789"[v % 10];
}
devrait faire l'affaire avec beaucoup moins de complications. (Pour commencer, il gère le cas où n est supérieur au nombre de chiffres correctement.)
- James Kanze
itoa est stdlib.h.
Vous pouvez également utiliser un autre itoa:
alternative à itoa () pour convertir entier en chaîne C ++?
ou
ANSI C, entier à chaîne sans fonction variadique
Il est également possible d'éviter la conversion de la chaîne au moyen de la fonction log10 , int cmath , qui renvoie le logarithme 10 de la base d'un nombre (à peu près toute sa longueur si elle était une chaîne):
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;
}
Je l'ai testé et fonctionne parfaitement bien (numéros négatifs sont un cas particulier). En outre, il doit être pris en compte, afin de trouver lLa nième élément, vous devez en arrière « de marche » dans la boucle, en soustrayant du int totale longueur .
Hope this helps.
Une réponse directe est:
char Digit = 48 + ((int)(Number/pow(10,N)) % 10 );
Vous devez inclure la bibliothèque <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);
En supposant number.at(n)
renvoie un chiffre décimal compris entre 0 ... 9, qui est.
Une approche plus générale:
template<int base>
int nth_digit(int value, int digit)
{
return (value / (int)pow((double)base, digit)) % base;
}
Juste vous permet de faire la même chose pour un nombre différent de base (par exemple 16, 32, 64, etc.).