剑指offer(12)--浮点数的整数次方

浮点数的整数次方

在这里插入图片描述

1.暴力算法:

这种算法效率不高

class Solution {
public:
         double Power(double base, int exponent) {
             if(exponent==0) return 1;
             if(base==0) return 0;
             double ans=1.0;
             if(exponent>0){
                 while(exponent>0){
                     ans*=base;
                     exponent--;
                 }
                 return ans;
             }else{
                 exponent=-exponent;
                 while(exponent>0){
                     ans*=base;
                     exponent--;
                 }
                 ans=1.0/ans;//注意这里除的时候要用1.0
                 return ans;
             }
         }
};

2.递归快速幂算法

假设我们求图片说明 ,如果我们知道图片说明 ,那么图片说明 ,所以图片说明但是还有个小问题,如果n是偶数,那么上述没问题。如果n是奇数,图片说明 , 比如图片说明
提供给系统的是power函数

class Solution {
public:
    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        return q_power(b, n);
    }
};
double q_power(double b, int n) {
        if (n == 0) return 1.0;
        double ret = q_power(b, n/2);
        if (n&1) { // 奇数
            return ret * ret * b;
        }
        else {
            return ret * ret;
        }
    }

时间复杂度:O(logn),每次规模减少一半
空间复杂度:O(logn),递归栈,因为要记住logn个变量

3.非递归快速幂算法

在这里插入图片描述
指数为偶数时对指数和底数做处理,指数为为奇数时将底数乘到ret

class Solution {
public:

    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        double x = b; // 记录x^0, x^1, x^2 ...
        double ret = 1.0;
        while (n) {
            if (n&1) {
                ret *= x; // 二进制位数是1的,乘进答案。
            }
            x *= x;
            n >>= 1;
        }
        return ret;
    }
};

上述方法相当于遍历n的二进制位,是1就乘进结果
时间复杂度:O(logn),因为n的二进制位个数为logn
空间复杂度:O(1)
快速幂实际上就是把二次指数拿到底数变成一次,大幅减少重复运算

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值