《剑指offer》第12题——求一个数的幂次方

131 阅读1分钟

题目:

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0

思路:

有几个需要注意的地方:

  • 由于是double类型,所以不能直接使用“==”来判断,重写一个equal()方法判断是否相等;

  • pow()函数不能直接调用,应该重写一个getPower()方法;

  • 优化求幂过程:

当n为偶数,a^n =(a^n/2)\*(a^n/2)
当n为奇数,a^n = a\^[(n-1)/2] \* a\^[(n-1)/2] * a

Java

package nowcoder;

public class S12_Power {
    public double power(double base, int exponent) {
        if (equal(base, 0.0) && exponent < 0){
            return 0.0;
        }
        int absexponent = exponent;
        if (exponent < 0) {
            absexponent = -exponent;
        }
        double res = getPower(base, absexponent);
        if (exponent < 0)
            res = 1.0/res;
        return res;
    }
    boolean equal(double num1, double num2){
        if ((num1 - num2 > -0.0000001) && (num1 - num2) < 0.0000001){
            return true;
        }
        return false;
    }
    <!--
    当n为偶数,a^n =(a^n/2)\*(a^n/2)
当n为奇数,a^n = a\^[(n-1)/2] \* a\^[(n-1)/2] * a-->
    double getPower(double b, int e){
        if (e == 0)
            return 1.0;
        if (e == 1)
            return b;
        double result = getPower(b, e>>1);
        result *= result;
        if ((e & 1)==1)
            result *= b;
        return result;
    }
    public static void main(String[] args){
        S12_Power s12 = new S12_Power();
        double result = s12.power(2,-3);
        System.out.print(result);
    }
}

Python

class Power:
    def power(self, base, exponent):
        if self.equal(base, 0.0) and exponent < 0:
            return 0.0
        absexponent = exponent
        if exponent < 0:
            absexponent = -exponent
        res = self.getPower(base, absexponent)
        if exponent < 0:
            res = 1.0/res
        return res
    def equal(self, num1, num2):
        if num1-num2>-0.0000001 and num1-num2<0.0000001:
            return True
        return False
    def getPower(self, b, e):
        if e == 0:
            return 1.0
        if e == 1:
            return b
        res = self.getPower(b, e >> 1)
        res *= res
        if e&1==1:
            res *= b
        return res

if __name__ == '__main__':
    test = Power()
    print(test.power(2, -5))