劍指Offer-其他-(2)
阿新 • • 發佈:2018-12-05
知識點:程式碼的完整性
題目描述
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
分析:一個簡單的問題,就是實現庫函式中的pow功能;要全面且高效
1:下面先是一個全面的程式碼:當指數是負數的時候;當指數為負數且底數為0的時候要考慮到;0的0次方在數學上是沒有意義的。
package 計算一個整數的n次冪; public class Solution{ public static double Power(double base,int exponent){ double result = 1;//規定0的任何次方都是0,沒有意義的也返回0; int n; if(exponent>0){ n=exponent; }else if(exponent<0){ if(base==0){ System.out.println("我不知道是對還是錯,不滿足冪函式的定義2018.11.21還在準備頭條中"); return result; } n=-exponent; }else { return result;//這個時候是冪次為0 } for(int i=0;i<n;i++){ result*=base; } if(exponent>=0){ return result; }else{ return 1/result; } } }
下面是測試案例
package 計算一個整數的n次冪;
public class Test {
public static void main(String[] args) {
double out1 = Solution.Power(5, -4);
System.out.println(out1);
double out2= Solution.Power(0, 0);
System.out.println(out2);
double out3 = Solution.Power(0, -4);
System.out.println(out3);
}
}
下面是執行結果
2:下面是更高效的一些方法(來源於《劍指Offer》)
程式碼如下(可以執行通過)***********中間的程式碼採用了遞迴的做法,減少了運算的次數,使得效率更高!!!!
public class Solution{ public double Power(double base,int exponent){ double result = 1; int n; if(exponent>0){ n=exponent; }else if(exponent<0){ if(base==0){ throw new RuntimeException("我不知道是對還是錯,不滿足冪函式的定義2018.11.21還在準備頭條中"); } n=-exponent; }else { return result;//這個時候是冪次為0 } //******************************************************************************* result = Power(base,n>>1); result*=result; //如果執行下面的程式碼說明:遞迴到了最後一層。 if((n&1)==1){ result*=base; } //******************************************************************************* if(exponent>=0){ return result; }else{ return 1/result; } } }
亮點體現在:
(1):用右移運算子代替了除以2;
(2):用 位與運算子和1做位於運算 代替了 求餘運算子 來判斷一個數是偶數還是奇數。