《劍指offer》之求數的整數次冪
題目:給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
分析:求解數的次方可以使用二進制來進行計算。例如:
10^1101 = 100001*100100*10^1000。
即:通過&1和>>1來逐位讀取1101,爲1時將該位代表的乘數累乘到最終結果。
解決方案:
-
暴力計算法:
代碼:
public double Power(double base, int exponent) { double result=1; for(int i=0;i<Math.abs(exponent);i++){ result*=base; } if(exponent<0){ result=1/result; } return result; }
測試性能分析:
運行時間:63ms 佔用內存:10388k
-
二進制
代碼:
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); }
性能測試分析:
運行時間:68ms 佔用內存:10432k