十七、整数的整次平方

描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
示例1
输入:2.00000,3
返回值:8.00000
示例2
输入:2.10000,3
返回值:9.26100
示例3
输入:2.00000,-2
返回值:0.25000
说明:
2的-2次方等于1/4=0.25

预处理:

求pow(b, n),如果n为负数怎么解决?
假如求图片说明 ,是不是可以转换图片说明
于是,预处理代码如下:

double Power(double b, int n) {
    if (n < 0) {
        b = 1 / b;
        n = -n;
     }
}

方法一:暴力方法

很显然就是n个b相乘。循环n次。

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent<0)
        {
            base=1/base;
            exponent=-exponent;
        }
        double ret=1.0;
        for(int i=0;i<exponent;i++)
        {
            ret=ret*base;
        }
        return ret;
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

方法二:递归法(快速幂)

在这里插入图片描述

class Solution {
public:
    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;
        }
    }
    double Power(double base, int exponent) {
        if(exponent<0)
        {
            base=1/base;
            exponent=-exponent;
        }
        return q_power(base,exponent);
    }
};

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

方法三:非递归的快速幂

在这里插入图片描述

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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值