leetcode題庫——Pow(x,n)
阿新 • • 發佈:2018-11-25
題目描述:
實現 pow(x, n) ,即計算 x 的 n 次冪函式。
示例 1:
輸入: 2.00000, 10 輸出: 1024.00000
示例 2:
輸入: 2.10000, 3 輸出: 9.26100
示例 3:
輸入: 2.00000, -2 輸出: 0.25000 解釋: 2-2 = 1/22 = 1/4 = 0.25
說明:
- -100.0 < x < 100.0
- n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。
方法1:快速冪【非遞迴】
class Solution { public: double myPow(double x, int n) { double res=1.0; double flag=x; if(n>pow(2,31)-1||n<-pow(2,31))return 0.0; if(n>0){ while(n>0){ if(n&1) res*=flag;//指數n是奇數 flag*=flag; n>>=1; } if(res>pow(2,31)-1||res<-pow(2,31)) return 0.0; } else if(n<0){ int N=-n-1; while(N>0){ if(N&1) res*=flag;//指數n是奇數 flag*=flag; N>>=1; } res=1/(res*x); if(res>pow(2,31)-1||res<-pow(2,31)) return 0.0; } else if(n==0) return 1.0; return res; } };
方法2:快速冪【遞迴】
class Solution { public: double res; double myPow(double x, int n) { if(n>pow(2,31)-1||n<-pow(2,31)) return 0.0; if(n==0) return 1.0; else if(n>0){ if(res>pow(2,31)-1||res<-pow(2,31)) return 0.0; if(n%2==0) res=myPow(x*x,n/2);//指數為偶數 if(n%2==1) res=x*myPow(x*x,n/2);//指數為奇數 return res; } else{ int N=-n-1; if(res>pow(2,31)-1||res<-pow(2,31)) return 0.0; if(N%2==0) res=myPow(x*x,N/2); if(N%2==1) res=x*myPow(x*x,N/2); res=1/(x*res); return res; } } };
思路:
快速冪運算,可以看做是按位進行的一種取冪運算
舉個例子:
看圖:指數n不斷除2
公式res:3^13 = (3^1) * (3^4) * (3^8) = [3^(2^0)] * [3^(2^2)] * [3^(2^3)]
附大佬應用快速冪的題目連結:https://www.cnblogs.com/dilthey/p/7868362.html