題目
給定一個double類型的浮點(diǎn)數(shù)base和int類型的整數(shù)exponent糯俗。求base的exponent次方尽纽。
程序核心思想
這個題目就是把所有情況羅列出來就可以了往湿,分類討論害碾。
要想到俘闯,指數(shù)要區(qū)分大于0、等于0肃拜、小于0的情況痴腌,因為指數(shù)小于0的時候,會出現(xiàn)倒數(shù)燃领。
由于會出現(xiàn)倒數(shù)士聪,就要考慮到分母為不為0的問題,所以猛蔽,又要考慮底數(shù)是不是0.
所以一共有3*2=6種情況:
序號 | 情況 | 結(jié)果 |
---|---|---|
1 | 底數(shù) = 0剥悟,指數(shù) > 0 | for循環(huán)正常算 |
2 | 底數(shù) = 0,指數(shù) = 0 | 1(沒意義曼库,但是編譯器里的結(jié)果為1) |
3 | 底數(shù) = 0区岗,指數(shù) < 0 | ∞(根據(jù)底數(shù)是正0還是負(fù)0,有正無窮和負(fù)無窮兩種情況) |
4 | 底數(shù) != 0毁枯,指數(shù) > 0 | for循環(huán)正常算 |
5 | 底數(shù) != 0慈缔,指數(shù) = 0 | 1 |
6 | 底數(shù) != 0,指數(shù) < 0 | 1 / for循環(huán)正常算 |
會出現(xiàn)四種情況(底數(shù)不管是不是0后众,只要指數(shù)為0胀糜,結(jié)果就是1;只要指數(shù)大于0蒂誉,結(jié)果就是正常算)教藻。整理如下:
序號 | 情況 | 結(jié)果 |
---|---|---|
1 | 指數(shù) = 0 | 1 |
2 | 指數(shù) > 0 | for循環(huán)正常算 |
3 | 底數(shù) = 0,指數(shù) < 0 | ∞(根據(jù)底數(shù)是正0還是負(fù)0右锨,有正無窮和負(fù)無窮兩種情況) |
4 | 底數(shù) != 0括堤,指數(shù) < 0 | 1 / for循環(huán)正常算 |
按照這四種情況編程即可。
Tips
- double類型的數(shù)是不是0不能通過簡單的==來計算绍移,應(yīng)該看它的絕對值是否小于一個足夠小的數(shù)悄窃。
Math.abs(base) < Math.exp(-6)
- double 類型的除法(體現(xiàn)在本題中就是對結(jié)果取倒數(shù)),要注意自動類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換蹂窖。
return normal(base, exponent);
- 正無窮和負(fù)無窮的表示方法: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;
}
}