JZ16 數值的整數次方
描述
實作函式 double Power(double base, int exponent),求base的exponent次方,
注意:
1.保證base和exponent不同時為0,
2.不得使用庫函式,同時不需要考慮大數問題
3.有特殊判題,不用考慮小數點后面0的位數,
方法1
思路
既然是求次方,那我們做不斷累乘就可以了,重點是處理負的次方數
具體做法:
step 1:先處理次方數為負數的情況,將底數化為分數解決,
step 2:遍歷次方數的次數,不斷累乘底數,
代碼
public double Power(double base, int exponent) {
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
double res = 1.0;
for (int i = 0; i < exponent; i++) {
res *= base;
}
return res;
}
方法2
思路
計算冪運算,我們還可以使用快速冪快速計算, 如果我們要計算5^10,常規的演算法是5?5=25,然后再25?5=125,如此往下,一共是9次運算,即n?1次,
但是我們可以考慮這樣:5?5=25(二次)、25?25=625(四次)、625?625=...(八次),這是一個二分的思維,運算次數縮減到了log2n次
具體做法:
step 1:先處理次方數為負數的情況,將底數化為分數解決,
step 2:使用快速冪計算次方:將已乘出來的部分求次方,可以每次縮小一半要求的次方數,
代碼
package mid.JZ16數值的整數次方;
public class Solution {
/*public double Power(double base, int exponent) {
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
double res = 1.0;
for (int i = 0; i < exponent; i++) {
res *= base;
}
return res;
}*/
public double Power(double base, int exponent) {
if (exponent < 0) {
base = 1 / base;
exponent = -exponent;
}
return Pow(base, exponent);
}
public double Pow(double base, int exponent) {
double res = 1.0;
while (exponent != 0) {
if ((exponent & 1) != 0) {
res *= base;
}
base *= base;
exponent = exponent >> 1;
}
return res;
}
public static void main(String[] args) {
new Solution().Power(5, 10);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/538785.html
標籤:Java
上一篇:第1章-資料結構與演算法是什么
下一篇:maven的作用及配置教程
