题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
方法1
- base == 0, return 0;
- exponent > 0 , return n个base相乘,
- exponent < 0 , return n个base相乘的倒数
方法2
快速求幂算法 O(logN)
如果一个数字的999次方,那么用上述算法便需要999次乘法,时间消耗巨大,故优化:
https://blog.csdn.net/hkdgjqr/article/details/5381028
方法3
用pow函数
测试
输入值为(2,3)
方法1结果: 0.125
方法2结果: 0.125
方法3结果: 0.125
代码
#include <iostream>
#include <math.h>
class Solution{
public:
//method 1
double Power(double base, int exponent){
// double类型判断等于零
if (base >= -1e-6 && base <= 1e-6){
return 0;
}
// 指数为0,返回1
else{
if (exponent == 0){
return 1;
}
if (exponent > 0){
double re(base);
for (int i = 1; i < exponent ; ++i) {
re = re * base;
}
return re;
}
if (exponent < 0){
double re(base);
for (int i = 1; i < -exponent; ++i) {
re = re * base ;
}
re = 1/re;
return re;
}
}
return 0;
}
// method 2
double method2Power(double base, int exponent){
int a(5),weight(base);
double re(1);
if(exponent < 0) {
exponent = -exponent;
while (exponent != 0) {
if (exponent & 1 == 1)
re *= weight;
weight *= weight;// 每次增加权重
exponent = exponent >> 1;//依次位右移
}
re = 1 / re;
} else{
while (exponent != 0) {
if (exponent & 1 == 1)
re *= weight;
weight *= weight;// 每次增加权重
exponent = exponent >> 1;//依次位右移
}
}
return re;
}
double method3Power(double base, int exponent){
return pow(base,exponent);
}
};
int main(){
Solution re;
double base(2);
int exponent(-3);
std::cout << " 输入值为(2,3)" << std::endl;
// std::cout << re.Power(base,exponent);
std::cout << " 方法1结果: " << re.Power(base,exponent) << std::endl;
std::cout << " 方法2结果: " << re.method2Power(base,exponent) << std::endl;
std::cout << " 方法3结果: " << re.method3Power(base,exponent) << std::endl;
// re.method2Power(base,exponent);
return 0;
}