Существует множество более быстрых альтернатив, которые я собирал в течение многих лет, которые обычно полагаются на реализацию функции recursive
, и сдвиги бит для обработки умножения, когда это оправдано. Ниже приведены функции, адаптированные к integer
, float
и double
. Они поставляются с обычным disclaimer:
, в то время как быстрее не все возможные испытания были выполнены, и пользователь должен проверить правильность ввода данных, прежде чем звонить и возвращаться ... blah, blah, blah .. Но они довольно полезны:
Я считаю, что правильная атрибуция идет до Geeks for Geeks Pow(x,n), как указано голубой луной. Я давно потерял ссылки ... Это похоже на них. (минус два или два).
/* Function to calculate x raised to the power y
Time Complexity: O(n)
Space Complexity: O(1)
Algorithmic Paradigm: Divide and conquer.
*/
int power1 (int x, unsigned int y)
{
if (y == 0)
return 1;
else if ((y % 2) == 0)
return power1 (x, y/2) * power1 (x, y/2);
else
return x * power1 (x, y/2) * power1 (x, y/2);
}
/* Function to calculate x raised to the power y in O(logn)
Time Complexity of optimized solution: O(logn)
*/
int power2 (int x, unsigned int y)
{
int temp;
if (y == 0)
return 1;
temp = power2 (x, y/2);
if ((y % 2) == 0)
return temp * temp;
else
return x * temp * temp;
}
/* Extended version of power function that can work
for float x and negative y
*/
float powerf (float x, int y)
{
float temp;
if (y == 0)
return 1;
temp = powerf (x, y/2);
if ((y % 2) == 0) {
return temp * temp;
} else {
if (y > 0)
return x * temp * temp;
else
return (temp * temp)/x;
}
}
/* Extended version of power function that can work
for double x and negative y
*/
double powerd (double x, int y)
{
double temp;
if (y == 0)
return 1;
temp = powerd (x, y/2);
if ((y % 2) == 0) {
return temp * temp;
} else {
if (y > 0)
return x * temp * temp;
else
return (temp * temp)/x;
}
}
Я не уверен, что вы правы насчет 'pow'. В некоторых реализациях он довольно хорошо оптимизирован. –
В случае мощности двух вы можете просто использовать операции сдвига: 1 << N означает 2^N. – sfrehse
1) Является ли '' '' 'двойным' с целым числом или' '' '' 'int'? 2) Какой тип должен быть результатом: 'double',' int', 'unsigned long long и т. Д.? – chux