1. 程式人生 > 實用技巧 >劍指12.數值的整數次方

劍指12.數值的整數次方

題目描述

給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。 保證base和exponent不同時為0

分析

看似簡單,需要注意的小細節比較多!!首先要充分考慮好邊界條件,還要考慮到如果指數exponent為負數的情況。

解法1(傳統解法,時間複雜度為O(n))

public class Solution {
    public double Power(double base, int exponent) {
        if (base ==0.0 && exponent <= 0)
            
throw new RuntimeException(); if (exponent == 0) return 1; if (base == 0) return 0; int absExponent = exponent > 0 ? exponent : -exponent; double result = 1.0; for(int i = 0; i < absExponent; i++) result *= base; return
exponent > 0 ? result : 1.0/result; } }

解法2(快速冪演算法,時間複雜度為O(logn))

快速冪求a的n次方:

另外,應儘可能用位運算代替乘除法以及求餘運算,因為位運算的效率要高得多!!比如,可以用右移代替除以2,用位運算子代替求餘運算子%來判斷一個數是的奇偶性。

☆解法2.1 快速冪的遞迴實現

public class Solution {
    public double Power(double base, int exponent) {
        if (base ==0.0 && exponent <= 0)
            
throw new RuntimeException(); if (exponent == 0) return 1; if (base == 0) return 0; int absExponent = exponent > 0 ? exponent : -exponent; double result = PowWithUnsignedExponent(base, absExponent); return exponent > 0 ? result : 1.0/result; } //快速冪演算法的遞迴實現 public double PowWithUnsignedExponent(double base,int absExponent){ if (absExponent == 0) return 1; if (absExponent == 1) return base; double result = PowWithUnsignedExponent(base,absExponent>>1);// 口訣:左移乘2,右移除2 result *= result; //位運算判斷奇偶性,如果為0即為偶數,反之為1即為奇數 if ((absExponent & 1)==1) result *= base; return result; } }

解法2.2 快速冪非遞迴實現,遞推

public class Solution {
    public double Power(double base, int exponent) {
        if (base ==0.0 && exponent <= 0)
            throw new RuntimeException();
        if (exponent == 0)
            return 1;
        if (base == 0)
            return 0;
        int absExponent = exponent > 0 ? exponent : -exponent;
        double result = 1.0;
        while(absExponent > 0){
            if((absExponent & 1) == 1)
                result *= base;
            absExponent = absExponent >> 1;
            base *= base;
        }
        return exponent > 0 ? result : 1.0/result;
    }
}