1. 程式人生 > >劍指Offer-其他-(2)

劍指Offer-其他-(2)

知識點:程式碼的完整性

題目描述
給定一個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做位於運算 代替了 求餘運算子 來判斷一個數是偶數還是奇數。