算法思想
实现幂运算,又不能从1循环到n,时间复杂度不够。所以要努力吧时间复杂度降下来,最好的方法就是 一直平方运算下去,
x
…
x
2
…
x
2
2
…
x
2
2
2
…
x \dots x^2\dots {x^2}^2 \dots {{x^2}^2}^2 \dots
x…x2…x22…x222…
也就是说
x
…
x
2
…
x
4
…
x
8
x\dots x^2\dots x^4\dots x^8
x…x2…x4…x8
但是这样只能当
n
=
2
a
a
为正整数
n=2^a \quad a为正整数
n=2aa为正整数时成立,所以需要处理其他情况
倒过来想如果
x
41
=
x
20
∗
x
20
∗
x
=
x
10
∗
x
10
∗
x
10
∗
x
10
∗
x
…
…
x^{41}=x^{20}*x^{20}*x=x^{10}*x^{10}*x^{10}*x^{10}*x\dots \dots
x41=x20∗x20∗x=x10∗x10∗x10∗x10∗x……
这样运算更快。
方法1:递归
class Solution {
public:
double myPow(double x, int n) {
double res=x;
//这里要改成long long 不然会超出
long long nn=n;
if(nn==0)return 1;
res=quickpow(x,abs(nn));
if(nn<0)
return 1/res;
return res;
}
double quickpow(double x,long long n){
// cout<<n<<endl;
if(n==1){
return x;
}
double res=quickpow(x,n/2);
if(n%2==0){
return res*res;
}
else{
return res*res*x;
}
}
};
方法2:迭代
41 | 20 | 10 | 5 | 2 | 1 | |
---|---|---|---|---|---|---|
contribute | x x x | x 2 x^2 x2 | x 4 x^4 x4 | x 8 x^8 x8 | x 16 x^{16} x16 | x 32 x^{32} x32 |
ans | x x x | x x x | x x x | x 9 x^9 x9 | x 9 x^9 x9 | x 41 x^{41} x41 |
根据上表可知,只有在奇数是才会记录ans,当 n = 1 n=1 n=1时就是加上一直平方的数,而前面的奇数就是加上之前处理的单个的数?
x 41 = x 20 ∗ x 20 ∗ x = x 10 ∗ x 10 ∗ x 10 ∗ x 10 ∗ x = x 5 ∗ x 5 ∗ x 5 ∗ x 5 ∗ x 5 ∗ x 5 ∗ x 5 ∗ x 5 ∗ x x^{41}=x^{20}*x^{20}*x=x^{10}*x^{10}*x^{10}*x^{10}*x\\=x^5*x^5*x^5*x^5*x^5*x^5*x^5*x^5*x x41=x20∗x20∗x=x10∗x10∗x10∗x10∗x=x5∗x5∗x5∗x5∗x5∗x5∗x5∗x5∗x
class Solution {
public:
double myPow(double x, int n) {
double res=x;
long long nn=n;
if(nn==0)return 1;
res=quickpow(x,abs(nn));
if(nn<0)
return 1/res;
return res;
}
double quickpow(double x,long long n){
// cout<<n<<endl;
double contribute=x,ans=1;
while(n){
if(n%2==1){
ans*=contribute;
}
n/=2;
contribute*=contribute;
}
return ans;
}
};