pow函数的实现

这篇博客讨论了如何通过递归降幂方法优化计算大数次方的效率,从原始的循环实现(时间复杂度O(n))改进到使用递归(时间复杂度O(log2n))。博主详细解释了递归过程,并给出了正负指数的处理策略,以减少不必要的计算,特别针对大数值的次方运算进行了优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求一个数x的n次方,最直接的方法就是循环,代码如下:

double myPow(double x, int n)
{
double ret=x;
if(n==0)
return 1;
if(n>0)
{
    for(int i=0;i<n-1;i++)
    x*=ret;
}
if(n<0)
{
    for(int i=0;i>=n;i--)
    x*=1/ret;
}
return x;
}

但是这种方法的时间复杂度是o(n),当n非常大时,时间开销会很大,比如计算1^2115453134154时,会重复很多不必要的操作
参考了其他大佬的代码后,明白了可以用递归降幂的方法来降低时间复杂度,比如计算2^4时,可以化为
(2*2)^2,
也就是说n 为正奇数时,可递归为 x * ( x * x)^ (n / 2)(n为int型,除2向下取整)
n为正偶数时,可递归为(x * x) ^ (n / 2)
n < 0时,转化为n > 0 的情况考虑,即1 / myPow(x, -n)考虑到当n = 2 ^ 31 - 1时-n会溢出,故改为 -(n + 1),再乘上一个x即可。代码如下:

double myPow(double x, int n)
{
if(n == 0)
return 1;
else if(n<0)
return 1/(x*myPow(x,-(n+1)));
else
{
    if(n%2==0)
        return myPow(x*x,n/2);
    else
        return x*myPow(x*x,n/2); 
}
}

这个函数的时间复杂度为o(log2 n),相比第一个函数时间时间花销小了不少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值