JAVA實現數值的整數次方(《劍指offern》)
阿新 • • 發佈:2019-01-26
題目:
給定一浮點數base和int型別的整數exponent。求base的exponent次方
牛客網題目截圖:
解答:
public class Solution { public double Power(double base, int exponent) { // 當底數為0,指數為負數時,則丟擲異常或者返回0.0 if (equal(base, 0) && exponent < 0) { return 0.0; } // 先對指數進行取絕對值計算 int absExponent = Math.abs(exponent); double result = powerWithExponent(base, absExponent); // 判斷如果傳入的指數是負數,進行取反,否則直接返回 if (exponent < 0) { result = 1.0 / result; } return result; } // 計算數值的整數次方 public double powerWithExponent(double base, int absExponent) { double result = 1.0; for (int i = 1; i <= absExponent; ++i) { result *= base; } return result; } // 判斷兩個double型別的數值是否相等 public boolean equal(double num1, double num2) { if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)) { return true; } else return false; } }
牛客網編譯通過截圖:
另附c++解答:
/** * 1.全面考察指數的正負、底數是否為零等情況。 * 2.寫出指數的二進位制表達,例如13表達為二進位制1101。 * 3.舉例:10^1101 = 10^0001*10^0100*10^1000。 * 4.通過&1和>>1來逐位讀取1101,為1時將該位代表的乘數累乘到最終結果。 */ public double Power(double base, int n) { double res = 1,curr = base; int exponent; if(n>0){ exponent = n; }else if(n<0){ if(base==0) throw new RuntimeException("分母不能為0"); exponent = -n; }else{// n==0 return 1;// 0的0次方 } while(exponent!=0){ if((exponent&1)==1) res*=curr; curr*=curr;// 翻倍 exponent>>=1;// 右移一位 } return n>=0?res:(1/res); }