73 votes

Comment faites-vous l'exponentiation * integer * en C #?

La fonction intégrée Math.Pow() dans .NET élève une base double à un exposant double et renvoie un résultat double .

Quelle est la meilleure façon de faire de même avec des entiers?

Ajouté: Il semble que l'on puisse simplement lancer le résultat Math.Pow() en (int), mais cela produira-t-il toujours le nombre correct et aucune erreur d'arrondi?

66voto

Vilx- Points 37939

Un assez rapide pourrait être quelque chose comme ceci:

 int IntPow(int x, uint pow)
{
    int ret = 1;
    while ( pow != 0 )
    {
        if ( (pow & 1) == 1 )
            ret *= x;
        x *= x;
        pow >>= 1;
    }
    return ret;
}
 

Notez que cela ne permet pas de pouvoirs négatifs. Je vous laisse cela comme un exercice. :)

Ajouté: Oh oui, presque oublié - ajoutez également la vérification de débordement / sous-débit, ou vous pourriez être dans quelques mauvaises surprises sur la route.

62voto

3dGrabber Points 761

LINQ quelqu'un?

 public static int Pow(this int @base, int exponent)
{
    return Enumerable
          .Repeat(@base, exponent)
          .Aggregate(1, (a, b) => a * b);
}
 

utilisation comme extension:

 var threeToThePowerOfNine = 3.Pow(9);
 

21voto

Charles Bretana Points 59899

En utilisant les mathématiques dans le lien du blog de John Cook,

     public static long IntPower(int x, short power)
    {
        if (power == 0) return 1;
        if (power == 1) return x;
        // ----------------------
        int n = 15;
        while ((power <<= 1) >= 0) n--;

        long tmp = x;
        while (--n > 0)
            tmp = tmp * tmp * 
                 (((power <<= 1) < 0)? x : 1);
        return tmp;
    }
 

7voto

John D. Cook Points 19036

Voici un article de blog qui explique le moyen le plus rapide d'élever des entiers à des puissances entières. Comme le souligne l'un des commentaires, certaines de ces astuces sont intégrées dans des puces.

3voto

bh213 Points 2927

Utiliser la version double, vérifier le débordement (au-dessus de max int ou max long) et convertir en int ou long?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X