題目
給定一個(gè)double類型的浮點(diǎn)數(shù)base和int類型的整數(shù)exponent。求base的exponent次方。
程序核心思想
這個(gè)題目就是把所有情況羅列出來(lái)就可以了,分類討論。
要想到,指數(shù)要區(qū)分大于0、等于0、小于0的情況,因?yàn)橹笖?shù)小于0的時(shí)候,會(huì)出現(xiàn)倒數(shù)。
由于會(huì)出現(xiàn)倒數(shù),就要考慮到分母為不為0的問(wèn)題,所以,又要考慮底數(shù)是不是0.
所以一共有3*2=6種情況:
| 序號(hào) | 情況 | 結(jié)果 |
|---|---|---|
| 1 | 底數(shù) = 0,指數(shù) > 0 | for循環(huán)正常算 |
| 2 | 底數(shù) = 0,指數(shù) = 0 | 1(沒(méi)意義,但是編譯器里的結(jié)果為1) |
| 3 | 底數(shù) = 0,指數(shù) < 0 | ∞(根據(jù)底數(shù)是正0還是負(fù)0,有正無(wú)窮和負(fù)無(wú)窮兩種情況) |
| 4 | 底數(shù) != 0,指數(shù) > 0 | for循環(huán)正常算 |
| 5 | 底數(shù) != 0,指數(shù) = 0 | 1 |
| 6 | 底數(shù) != 0,指數(shù) < 0 | 1 / for循環(huán)正常算 |
會(huì)出現(xiàn)四種情況(底數(shù)不管是不是0,只要指數(shù)為0,結(jié)果就是1;只要指數(shù)大于0,結(jié)果就是正常算)。整理如下:
| 序號(hào) | 情況 | 結(jié)果 |
|---|---|---|
| 1 | 指數(shù) = 0 | 1 |
| 2 | 指數(shù) > 0 | for循環(huán)正常算 |
| 3 | 底數(shù) = 0,指數(shù) < 0 | ∞(根據(jù)底數(shù)是正0還是負(fù)0,有正無(wú)窮和負(fù)無(wú)窮兩種情況) |
| 4 | 底數(shù) != 0,指數(shù) < 0 | 1 / for循環(huán)正常算 |
按照這四種情況編程即可。
Tips
- double類型的數(shù)是不是0不能通過(guò)簡(jiǎn)單的==來(lái)計(jì)算,應(yīng)該看它的絕對(duì)值是否小于一個(gè)足夠小的數(shù)。
Math.abs(base) < Math.exp(-6)
- double 類型的除法(體現(xiàn)在本題中就是對(duì)結(jié)果取倒數(shù)),要注意自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。
return normal(base, exponent);
- 正無(wú)窮和負(fù)無(wú)窮的表示方法:Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY
代碼
public class Solution {
public double Power(double base, int exponent) {
if(exponent == 0){
return 1;
}
int flag_1 = 1; //正
if(exponent < 0){
exponent *= -1;
flag_1 = 0; //負(fù)
}
int flag_2 = 1;//不是0
if(Math.abs(base) < Math.exp(-6)){
flag_2 =0; //0
}
if(flag_1 == 1){
return normal(base, exponent);
}else{
if(flag_2 == 1){
return 1.0 / normal(base, exponent);
}else{
if(base > 0){
return Double.POSITIVE_INFINITY;
}else{
return Double.NEGATIVE_INFINITY;
}
}
}
}
public double normal(double base, int exponent){
int answer = 1;
for(int i = 0; i < exponent; i++){
answer *= base;
}
return answer;
}
}