实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
示例 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 :刚拿到这道题的时候,我就想着直接x**n 就完事了,但是时间复杂度很高,做乘方运算的时候,2^11次方。会进行11个2进行运算。
思路2:在网上查到,有一种神奇的方法,快速幂法。
快速幂法:
第一步:x的n次方。 将n拆成2进制。 2^11. 11- >1011。11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1 (8+2+1) 。
第二步:利用数学的指数的乘法。 2^(8+2+1)=2^8 *2^2*2^1 。只需要进行三次计算,
现在我们开始写算法:由于是二进制,很自然地想到用位运算这个强大的工具:&和>> 。
& 求和。 & 运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。
>> 右移动。运算比较单纯,二进制去掉最后一位。
步骤先变成2进制,然后 二进制的最后一位。二进制的倒数第二位。
base=x#基本指数,第一次*1 *base *base ,翻倍。
n&1==1: 就是二进制。
if n < 0: base, n = 1 / x, -n :负数。
if n < 0: base, n = 1 / x, -n
浙公网安备 33010602011771号