數值的整數次方 一道題培養你的嚴密思維

2021-10-04 12:08:02 字數 3858 閱讀 7271

實現函式double power(double base, int exponent),求baseexponent次方。不得使用庫函式。同時不需要考慮大數問題。

此題**於《劍指offer》面試題

這個題很具魔性,你準備好了嘛?

前方高能!!!快快對號入座吧!

小夥伴,你是否覺得這道題很簡單?於是在三十秒內寫出了下列的**:請對號入座

double

mypow

(double x,

int n)

return ans;

}

或者:

double

mypow

(double x,

int n)

(。・∀・)ノ゙嗨,小夥伴,是你嘛?

面試官:我好像沒有說n一定為正數吧?

於是你重整旗鼓,又在三十秒內寫出了下列**:請對號入座

double

mypow

(double x,

int n)

return n>

0?ans:

1/ans;

}

或者:

double

mypow

(double x,

int n)

(。・∀・)ノ゙嗨,小夥伴,是你嘛?

面試官:我好像也沒說x不可以為0吧?

恍然大悟的你,開始思索,如果0傳入就沒有意義了呀?我怎樣處理呢?

於是忽然發現了什麼,雖然沒有意義,但我們也要象徵性的表示我們考慮了這個值吧?我們可以返回0,於是寫出了下面的**:

double

mypow

(double x,

int n)

return n>

0?ans:

1/ans;

}

或者:

double

mypow

(double x,

int n)

感覺已經完全考慮到了所有的情況,應該是沒問題了,然後開始暗暗的責怪自己,怎麼這麼簡單的問題這麼不小心。

面試官:給你一組資料,自己測試一下: 0.00001 2147483647

這,,不是說不需要大數問題嗎??

這其實好像也是int型的最大範圍,嚴格意義上應該也不算是大數問題。

先執行一下…

已崩潰,說明是演算法的問題,需要對演算法進行優化,怎麼優化呢?

細細想來,這個o(n)好像真的沒辦法優化了,又不能使用庫函式。

我們仔細觀察一下冪運算的過程,如果計算350次冪,怎麼辦呢?

50次乘法肯定是最差的想法,可不可以優化一下呢?

如果我們計算3^25 * 3^25,然後再計算3^12 * 3^12 *3,這樣計算是不是會少很多運算量呢?

仔細想想,時間複雜度已經降低為了o(logn)

思路是這樣的:

有了這條思路,於是寫出下面的**:

double

mypow

(double x,

int n)

while

(n >0)

return ans;

}

或者:

double

mypow

(double x,

int n)

return

topow

(x,n);}

double

topow

(double x,

int n)

這次應該沒有問題了,演算法已經優化得比較好了。

面試官:再給你一組資料:2.00000 -2147483648,測試一下

執行一下,咦,出錯了,這,,仔細思考一下。。。

原來是int的邊界值忽略了,負邊界轉向正邊界時,會溢位,呀,真不小心,感覺補出下面的**:

double

mypow

(double x,

int n)

while

(exp >0)

return ans;

}

或者:

double

mypow

(double x,

int n)

return

topow

(x,exp);}

double

topow

(double x,

long n)

這個應該再沒有可以挑剔的地方了,是的,應該完全沒有了,對的。

仔細想想,好像沒有犯什麼錯誤了,把**看過來看過去,看過來看過去,不可能有錯啊。

崩潰的邊緣,終究是乙個人抗下了所有。

無奈,彷徨,生無可戀…

你是怎麼判斷兩個數相等的?

小朋友,你是否有很多問號???

噢噢,終於發現了,原來,原來,原來,原來double不能用==判斷,原因是計算機的小數都是不準確的,只能精確到一定數值,所以,當兩數之差小於精確值,我們就可以認定相等了。

恍然大悟。

double

mypow

(double x,

int n)

while

(exp >0)

return ans;

}

時間複雜度: o(logn)

空間複雜度:o(1)

double

mypow

(double x,

int n)

return

topow

(x, exp);}

double

topow

(double x,

long n)

時間複雜度:o(logn)

空間複雜度:o(logn)

真實的面試其實並不是有這麼多的機會,有可能你的一下失誤,瞬間失去了面試官對你的興趣,所以,思維變得完善起來吧!

我們將其中得到的啟示提取出來:

atfwus --writing by 2020–03–27

程式設計題 數值的整數次方

題目描述 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。保證base和exponent不同時為0 我的思考 1 如果次方是正樹,即直接迴圈累乘即可 2 如果次方是0的話,任何數的0次方都是1 3 如果次方是小於0的數的話,則在迴圈的時候...

每天一道劍指offer 數值的整數次方

給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。首先要把所有的情況都考慮在內,比如基數和指數為0的情況,指數為負數的情況。然後說一下一種比較優的思路,比如乙個數的32次方,它與這個數16次方的平方相等,依次類推,求乙個數的32次方只需做5...

數值的整數次方

題目 實現函式double power double base,int exponent 求base的exponent次方。不得使用庫函式,同時不需要考慮大樹問題。這道題目有以下幾點需要注意 0的0次方是無意義的,非法輸入 0的負數次方相當於0作為除數,也是無意義的,非法輸入 base如果非0,如果...