劍指offer 數值的整數次方

2021-08-29 15:50:27 字數 1109 閱讀 1871

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

參考:思路1:求乙個數的n次冪,通過迴圈不斷累成即可。但是需要考慮一些特殊情況,比如0次冪,以及冪為負數的情況。

實現1:

/*

* 拍腦袋的操作:對一些特殊情況做處理,如0次冪則直接返回1,負數次冪,則求結果的倒數。

* 通過不斷迴圈來實現。存在的問題是,是多少次冪,就需要做多少次乘法操作,效率不高。

* */

public double power(double base, int exponent)

int exponents=math.abs(exponent);

int result=1;

for (int i = 0; i 思路2:求數值的次方時,是用乙個迴圈來進行乘法計算的​,比如求乙個數值的30次方,那麼就得迴圈30次才能算出來,我們能不能在這個過程裡優化一下,其實求30次方,相當於15次方和15次方相乘。也就是說計算到15次方的時候,直接求它自身的平方就行了,不用往後繼續蠻算了。那麼15次方也會依賴7次方,一直往下,最後依賴的是0次方或1次方,這是乙個很清晰的遞迴過程。

但是需要考慮n=exponent為偶數和奇數時的情況,如果是n為偶數,則2個base的((n)/2)次冪相乘。

如果是奇數,則是2個base的((n-1)/2)次冪相乘。再乘以base。

trick:

(1)冪取半,可以通過二進位制數,右移一位得到。。

(2)判斷乙個數的奇偶性,可以通過將它和1相與得到。如果為1,則為奇數,否則為偶數。

實現2:

public double power2(double base, int exponent)

if(exponent==1)

int abs_exponent=math.abs(exponent);

double result=power2(base, abs_exponent>>1);

result*=result;

if((abs_exponent&1)==1)

return(exponent<0?(1.0/result):result);

}

劍指offer 數值的整數次方

1 題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。2 思路 需要考慮到的情況 1 指數為負數的時候,可以先對指數求絕對值,算出次方之後的結果再取倒數。2 當底數是0,指數是負數的時候,可以將無效變數設定為true,並返回0。3...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。將指數大於0,小於0,等於0 底數不為0 的情況分開。其實指數為0的情況不必單獨拎出來 不進入if直接返回result為1.0 真正需要考慮的是,底數為0而指數為負的情況,數學上沒有意義。書...

劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。1.最直觀的方法,遞迴求解a b a a b 1 當然也可以用迴圈實現。要注意特殊情況,指數為0時乘方結果都是1 指數為負數時的計算,可以先轉化為正數再求倒數,但是底數為0時不能求導。2.效...