[剑指Offer]:数值的整数次方(循环解答,快速幂---递归、循环)

109 阅读1分钟

文章目录


题目描述

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

保证base和exponent不同时为0

示例:

输入
2,3

返回值
8.00000

解答思路

  • 检查底数是否为0,如果底数为0,无论指数多少,算式是无意义的!!!
  • 当exponent为0时,任何数0次方为1,直接返回1;
  • 判断exponent是否小于0,如果小于0,通过标志位flag记录,将exponent转化成正数
  • 循环计算正数次方下的底数次幂。
  • 当标志位flag < 0时,将res取倒数。

注意:不要分别在exponent大于0,小于0条件下分别计算base的abs(exponent)次方,这样出现重复计算,使复杂度增加

代码实现:

class Solution {
public:
    double Power(double base, int exponent) {
        if(fabs(base - 0.0) < 1e-15){
            cout << "底数是0无意义" << endl;
            return 0.0;
        }
        double res = 1.0, flag = 1.0;
        if(exponent == 0) return res;
        else if(exponent < 0){
            flag = -1.0;
            exponent = fabs(exponent);
        }
        for(int i = 1; i <= exponent; ++i){
            res *= base;
        }
        return flag > 0 ? res : 1.0 / res;
    }
};

快速幂

使用递归,时间复杂度O(logn)

  • 当n为偶数,an = an/2 * an/2
  • 当n为奇数,an = a(n-1)/2 * a(n-1)/2 *a
class Solution {
public:
    double Power(double base, int exponent) {
        if(fabs(base - 0.0) < 1e-15){
            cout << "底数是0无意义" << endl;
            return 0.0;
        }
        double res = 1.0, flag = 1.0;
        if(exponent == 0) return res;
        else if(exponent < 0){
            flag = -1.0;
            exponent = fabs(exponent);
        }
        // else if(exponent == 1) return base;
        // res *= Power(base, exponent>>1);
        // res *= res;
        // if(exponent & 0x1) res *= base;
        
        // 也可以用递归做,这里采用了循环
        while (exponent) {
            if (exponent & 0x1) res *= base;
            base *= base;
            exponent >>= 1;
        }
        return flag > 0 ? res : 1.0 / res;
    }
};