Замена функции Pow - C (СИ)
Формулировка задачи:
Здравствуйте, можно ли как-то иначе заменить функцию Pow?
#include <stdio.h>
#include <math.h>
//Замена Pow
double Ext (int x, int n) {
int ext = 1, i;
for (i = 1; i <= n; i++) {
ext *= x;
}
return ext;
}
double Sum(int n) {
double sum = 0;
for (int i = 2; i <= n; i++) {
sum += Ext(-1, i) * (i/(Ext(i, 3) - i));
}
return sum;
}
int main(int argc, const char * argv[]) {
int n;
printf("n = "); scanf("%d", &n);
printf("sum = %.10f\n", Sum(n));
return 0;
}Решение задачи: «Замена функции Pow»
textual
Листинг программы
int power_recursive(int x, unsigned int n) {
return n == 0 ? 1 : x * power_recursive(x, n - 1);
}
int power_effective(int x, unsigned int n) {
int p = 1;
while (n) {
if (n & 1) { p *= x; }
n >>= 1;
x *= x;
}
return p;
}
Объяснение кода листинга программы
- В функции
power_recursiveпроисходит рекурсивный вызов функцииpower_recursiveс аргументами(x, n-1). - Если
nравно 0, то возвращается 1. - В функции
power_effectiveинициализируется переменнаяpравной 1. - Затем в цикле
whileпроисходит проверка битаnна 1. - Если бит
nравен 1, то переменнаяpумножается наx. - Значение
nсдвигается вправо на 1 бит. - Значение
xумножается наx. - Цикл продолжается до тех пор, пока
nбольше 0. - По завершении цикла возвращается значение переменной
p.