题目描述
白话题目:
模拟实现pow,幂函数,得快一点,还要注意负数的绝对值超过了正式的取值范围。
算法:
递归,降幂,减少累乘次数
1、n为0,返回1
2、n为正偶数,如n=4,即2^4=2*2*2*2,可以拆解为(2*2)^(n/2)
3、n为正奇数,如n=3,即2^3=2*2*2,可以拆解为2*((2*2)^(n-1/2)) ,极端情况n=1 为 2*(2^0)=2也是正确的
4、n为负数,首先考虑到的是递归1/(myPow(x,-n)),但是n若为2^31-1时-n溢出,因此这里用n+1计算,小调一下,再额外乘以一次x即可
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
double myPow(double x, int n)
{
if (0 == n)
{
return 1;
}
if (n < 0)
{
return 1 / (x * myPow(x, -(n + 1)));
}
if (0 == n % 2)
{
//偶数
return myPow(x * x, n / 2);
}
else
{
//奇数
return x * myPow(x * x, (n - 1) / 2);
}
}
int main()
{
double x;
scanf("%lf",&x);
int n;
scanf("%d",&n);
double result=myPow(x, n);
printf("%lf\n",result);
return 0;
}