琼海在线/网页优化怎么做
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
牛客网题目链接
求解思路1
常规解法,需要注意几个点即可:
- 底数为
0
,不管多少次方都为0
(一般底数不为0
) - 指数为
0
,结果为1
- 指数为负数,结果为正数次幂的倒数
class Solution {
public:double Power(double base, int exponent) {double res=base;if(exponent){if(exponent>0){for(int i=1;i<exponent;i++)res*=base;return res;}else{for(int i=1;i<-exponent;i++)res*=base;return 1.0/res;}}else if(base==0){return 0;}else{return 1.0;}}
};
运行时间:2ms占用内存:376k
求解思路2
据说啊,有这么一个公式:
我们回过头来看看思路1中的解法,如果我们要计算a
的32
次方的话就要计算32
次
而有了上面的公式,我们要计算a
的32
次方,可以这么算:
先算a2a^2a2 -> 再算a4=a(2)×2a^4=a^{(2)\times 2}a4=a(2)×2 -> 再算a8=a(4)×2a^8=a^{(4)\times 2}a8=a(4)×2 -> 再算a16=a(8)×2a^{16}=a^{(8)\times 2}a16=a(8)×2,最后算a32=a(16)×2a^{32}=a^{(16)\times 2}a32=a(16)×2
哇,amazing!
算一个数的32
次方我们只需要计算5
次就可以了!!!
由于我们计算的次方比较低,因此可以采用递归的方法来计算,代码如下:
class Solution {
public:double Power(double base, int exponent) {if(exponent>0)return calculate(base,exponent);elsereturn 1.0/calculate(base,-exponent);}double calculate(double base,int exponent){if(exponent==0)return 1.0;if(exponent==1)return base;double res=calculate(base,exponent>>1);res*=res;if(exponent&0x1)res*=base;return res;}
};
运行时间:3ms占用内存:376k