题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
题目分析
- 题目有两种方法
1.直接使用暴力遍历来做
2.使用一种新算法:快速幂
- 暴力遍历复杂度O(n),不提倡。这里主要讲解一下快速幂。
对于快速幂:时间复杂度O(logb)
我们已知 2^3 求 2^6,不就是 2^3 * 2^3嘛。快速幂就是这个原理。
那有同学问了遇到奇数怎么办?2 ^ 5??
那不就是 2 * 2 ^ 4 这不就成了嘛。
所以这就是快速幂的基本思路求a ^ b
1)当b是奇数时,那么有 a^b = a * a^*(b-1)
2)当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2)
举个例子?2 ^10
2^10 = 2^5 * 2^5
2^5 = 2 * 2^4
2^4 = 2^2 * 2^2
2^2 = 2^1 * 2^1
2^1 = 2 * 2^0
- 快速幂的两种表现:递归和迭代
递归
ll binaryPow(ll a, ll b, ll m){
ll ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
迭代
typedef long long ll
ll binaryPow(ll a, ll b, ll m){
ll ans = 1;
while(b > 0){
if(b & 1){
ans = ans * a % m;
}
a = a * a % m;
b >>= 1;
}
return ans;
}
题目代码
递归
public class Solution {
public double Power(double base, int exponent) {
int flag;
if (exponent > 0) {
flag = 1;
} else {
exponent = -exponent;
flag = 0;
}
if (exponent == 0) {
return 1;
} else if (exponent % 2 == 1) {
if (flag == 1) {
return base * Power(base, exponent - 1);
} else {
return 1 / (base * Power(base, exponent - 1));
}
} else {
double sum = Power(base, exponent / 2);
if (flag == 1) {
return sum * sum;
} else {
return 1 / (sum * sum);
}
}
}
}
迭代
public class Solution {
public double Power(double base, int exponent) {
double ans = 1;
if (exponent > 0) {
while (exponent > 0) {
if ((exponent & 1) == 1) {
ans = ans * base;
}
base = base * base;
exponent = exponent >> 1;
}
return ans;
} else if (exponent == 0) {
return 1;
} else {
exponent = -exponent;
while (exponent > 0) {
if ((exponent & 1) == 1) {
ans = ans * base;
}
base = base * base;
exponent = exponent >> 1;
}
return 1 / ans;
}
}
}