面试题16. 数值的整数次方

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 1:

输入: 2.00000, 10
输出: 1024.00000
示例 2:

输入: 2.10000, 3
输出: 9.26100
示例 3:

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。

解题思路:
①直接相乘法:xxxx……,时间复杂度为O(n),超出时间限制。
②快速幂法:
Ⅰ.将指数通过“&1”运算和>>等方法用二进制表示法表示为2的i次幂的和的形式,再对x进行若干偶次幂的循环相乘(x² = x
x,x^4 = x²*x²……),大大减少了运算次数。
Ⅱ.二分递归
递归计算n/2次幂,注意:n为奇数时,x^n = x^n/2的平方再乘以x;
n为偶数时,x^n = x^n/2的平方。

//求幂直接x*x*x*x*x相乘,时间复杂度为O(n),超出时间限制
/*double myPow(double x, int n){

    if(!n) return 1;
    long b = n;

    int flag = 0;
    double res = x;

    if(b < 0) {
        
        b = (-1)*b;
        flag = 1;
    }

    while((b-1) != 0)
    {
        res = res*x;    
        --;
    }

    if(flag){
          res = 1/res; 
        }

    return res;
}*/
//快速幂法(二分递归) 时间复杂度为O(logN).
double myPow(double x, int n)
{
    long b = n; //int的范围为-2147483648 ~ 2147483647,当n=-2147483648时,取反会超出范围,故重新定义为long型
    
    if(b == 0) return 1;    //递归终止条件
    
    if(b < 0)   //负数幂的处理
    {
        x = 1/x;
        b = -b;
    }
    

    double value = myPow(x,b/2);
    if(n%2 == 0) value = value*value;   //偶数数幂为二分幂的平方
    if(n%2 != 0) value = value*value*x; //奇数幂为二分幂的平方再乘以x
    return value;  
}

设计递归时,可以这样想:n = 7时,不管怎么得到的,就认为value是三次幂的值。

你可能感兴趣的:(面试题16. 数值的整数次方)