描述

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。

实际上就是实现一个计算 a ^ b 的函数。

朴素算法

让 exponent 个 base 相乘,时间复杂度是 O(exponent)。
图片说明

// c++
class Solution {
public:
    double Power(double base, int exponent) {
        double res = 1;
        if (exponent < 0) base = 1 / base, exponent = -exponent; // 注意指数为负,底数变成 1/base
        while (exponent--) 
            res *= base;
        return res;
    }
};
# python3
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        res = 1
        if exponent < 0: base, exponent = 1/base, -exponent
        for _ in range(exponent):
            res *= base
        return res

快速幂

将 exponent 看成二进制,例如:
图片说明
可以看出规律,exponent 每一位是否为 1 决定了是否乘 base 的某次方,而 base 的某次方可以通过循环累乘得到,这样就把算法的时间复杂度降为了 O(log(exponent))。这个方法也叫快速幂。

// c++
class Solution {
public:
    double Power(double base, int exponent) {
        double res = 1;
        if (exponent < 0) base = 1 / base, exponent = -exponent;
        while (exponent) {
            if (exponent & 1) res *= base;
            base *= base;
            exponent >>= 1;
        }
        return res;
    }
};
# python3
# -*- coding:utf-8 -*-
class Solution:
    def Power(self, base, exponent):
        # write code here
        res = 1
        if exponent < 0: base, exponent = 1/base, -exponent
        while exponent:
            if exponent & 1: res *= base
            base, exponent = base ** 2, exponent // 2
        return res