【劍指offer】給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
阿新 • • 發佈:2018-12-23
題目要求
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
核心思想
兩個要點:
-
<< : 左移運算子,num << 1,相當於num乘以2
>> : 右移運算子,num >> 1,相當於num除以2
>>> : 無符號右移,忽略符號位,空位都以0補齊(負數用1補齊) -
一個整數a, a & 1 這個表示式可以用來判斷a的奇偶性。二進位制的末位為0表示偶數,最末位為1表示奇數。使用a%2來判斷奇偶性和a & 1是一樣的作用,但是a & 1要快好多。
完整程式碼如下
/**
* 給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
*/
public class Solution {
public double Power(double base, int exponent) {
if(exponent < 0 && base == 0) throw new RuntimeException("分母不能為0");
int exp = Math.abs(exponent);
if(exponent == 0) return 1 ;
if(exponent == 1) return base;
//<< : 左移運算子,num << 1,相當於num乘以2
//>> : 右移運算子,num >> 1,相當於num除以2
//>>> : 無符號右移,忽略符號位,空位都以0補齊(負數用1補齊)
double result = Power(base, exp >>> 1);
result *= result;
//一個整數a, a & 1 這個表示式可以用來判斷a的奇偶性。
//二進位制的末位為0表示偶數,最末位為1表示奇數。
//使用a%2來判斷奇偶性和a & 1是一樣的作用,但是a & 1要快好多。
if((exp & 1) == 1) {
result *= base;
}
return exponent < 0 ? (1.0 / result) : result;
}
public static void main(String[] args) {
Solution sl = new Solution();
System.out.println(sl.Power(5.0, 3));
}
}