Обычная реализация - что-то вроде этого (взято из статьи википедии ):
long power(long x, unsigned long n)
{
long result = 1;
while (n > 0) {
/* n is odd, bitwise test */
if (n & 1) {
result *= x;
}
x *= x;
n /= 2; /* integer division, rounds down */
}
return result;
}
Рекурсия не нужна или (я бы сказал) особенно желательна, хотя она может выиграть при очевидности:
long power(long x, unsigned long n)
{
if (n == 0) return 1;
long result = power(x, n/2); // x ^ (n/2)
result *= result; // x ^ (n/2)*2
if (n & 1) result *= x; // x ^ n
return result;
}
Конечно, в любой версии вы переполняете длинную довольно быстро. Вы можете применить те же алгоритмы к своему любимому представлению bigint, хотя любая библиотека bigint уже будет включать в себя целочисленную степенную функцию.
Обе версии указанной выше функции возвращают 1 для power(0,0)
. Вы можете или не можете считать это ошибкой.