问题:50. Pow(x, n) - 力扣(LeetCode)求x的n次幂
分析:常规算法是循环相乘,时间复杂度On;这里介绍一种Ologn算法——快速幂,用于求解大数运算时复杂度较高,爆int情况。
原理:观察可知,任意一个数(如7)都可以转化成若干个2的幂次的和(4+2+1)。这是因为7=111,而111=100+10+1。因此在快速幂中,一次判断每一个位置是否为1,是的话乘x的对应次幂即可。若n为负数,则x=1/x;n=-n即可。
func myPow(x float64, n int) float64 {
if x == 0.0{
return 0.0
}
if n<0{
x,n=1/x,-n
}
var res float64=1.0
for n>0{
if n&1==1{
res*=x
}
x*=x
n>>=1
}
return res
}
以上是基础算法,对于一些题需要对1000000007取模,可以使用下面改进算法计算%p
func qm(x,n,p int64)int64{
var ans int64=1
t:=x
for n>0{
if n&1==1{
ans=(ans*t)%p
}
n>>=1
t=(t*t)%p
}
return ans
}