标签:end lan src self http tco python 十进制 int
1、最简单直观的方法就是循环相乘,但是会超时
2、快速幂(二进制角度)
对于任意十进制n,设其二进制为\(b_m\)...\(b_2b_1\),则有
根据上面的推导,可以把\(x^n\)的计算,转化为
3、快速幂(递归二分)
4、快速幂(非递归二分)
非递归形式同二进制形式原理相同,以\(x^{77}=x\cdot x^4 \cdot x^8 \cdot x^{64}\)为例,x一直在累积平方,遇到奇数则将当前的x乘到结果上。
\( \begin{aligned} x^{77} =&\ (x^2)^{38}\ \ \ \ * \ \ \ \ x \ \ \ \ \ \ \ \ 1 \(x^2)^{38} =&\ (x^4)^{19}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \(x^4)^{19} =&\ (x^8)^9\ \ \ \ \ * \ \ \ \ x^4 \ \ \ \ \ \ \ 0 \(x^8)^9 =&\ (x^{16})^4\ \ \ \ * \ \ \ \ x^8 \ \ \ \ \ \ 1 \(x^{16})^4 =&\ (x^{32})^2\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \(x^{32})^2 =&\ (x^{64})^1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 0 \(x^{64})^1 =&\ (x^{128})^0\ \ \ * \ \ \ \ x^{64}\ \ \ \ 1 \end{aligned} \)
Python
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
# 暴力循环求解 291/304 超时
# t = abs(n)
# result = 1.0
# while t:
# result *= x
# t -= 1
# if n < 0:
# return 1.0 / result
# else:
# return result
# # 快速幂(二进制)
# t = abs(n)
# result = 1.0
# while t:
# if t & 1:
# result *= x
# x *= x
# t >>= 1
# if n < 0:
# return 1.0 / result
# else:
# return result
# # 快速幂(递归二分)
# if n == 0:
# return 1.0
# if n < 0:
# return 1.0 / self.myPow(x, -n)
# if n & 1:
# return x * self.myPow(x, n-1)
# return self.myPow(x * x, n // 2)
# 快速幂(非递归二分, 同二进制思想一致)
result = 1.0
t = abs(n)
while t:
if t % 2:
result *= x
x *= x
t //= 2
if n < 0:
return 1.0 / result
else:
return result
标签:end lan src self http tco python 十进制 int
原文地址:https://www.cnblogs.com/cling-cling/p/12966453.html