1. 程式人生 > >【劍指offer】給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

【劍指offer】給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

題目要求

給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

核心思想

兩個要點:

  1. << : 左移運算子,num << 1,相當於num乘以2
    >> : 右移運算子,num >> 1,相當於num除以2
    >>> : 無符號右移,忽略符號位,空位都以0補齊(負數用1補齊)

  2. 一個整數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)); } }