Question

Je suis en train de trouver le chiffre nth 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?

Était-ce utile?

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top