题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
总结:
(1).本题主要考察思考问题全面性,exponent大于0、小于0、等于0;
(2).代码细节:“>>1”代替“除以2”,“&”代替“%”判断奇偶数;
因为 >>和%运算效率更高。
(3).三目运算符号 “?:” 条件?结果1:结果2。
相当于if...else...是否满足条件,满足输出结果1,不满足输出结果2;
一、普通方法 O(n)
分情况讨论:
result=X^n。
n=0,result=1;
n>0,result=n个X相乘,即令result=1,result*=x循环;
n<0,result=1/(n个X相乘),同上,最后结果再用1除以它;
class Solution {
public:
double Power(double base, int exponent) {
double result;
if(exponent==0) result=1;
else if(exponent>0){
result=1;
for(int i=1;i<=exponent;i++)//O(n)
{
result=result*base;//base几次方就是几个base相乘
}
}
else{
for(int i=1;i<=(-exponent);i++){
result=result*base;
}
result=1/result;//负数次方就是倒数
}
return result;
}
};
二、更简洁一点的常规解法O(n)
将负数提前转为正
double型不能用简单的==判断,一般的比较方式是: 相减的差在一个很小的区间内,我们认为是相等的。
class Solution {
public:
double Power(double base, int exponent) {
if(exponent==0) return 1.0;
/*如果base=0输出0
double型不能用简单的==判断,一般的比较方式是:
相减的差在一个很小的区间内,我们认为是相等的。
*/
if(base>-0.000001&&base<0.000001)
return 0;
double result=1.0;
if(exponent<0)//exponent为负数时将它转为正
{
exponent=-exponent;//转为正数
base=1/base;//分之一
}
while(exponent!=0)//依次连乘
{
result*=base;
exponent--;
}
return result;
}
};
三、快速幂算法 O(logn)
取模(求余)运算公式: (a*b)%c = (a%c)*(b%c)%c
积的取余等于取余的积的取余。
当计算的数字太大时,占用时间和空间,可能超出计算机整数的存取范围,传统的连乘计算方式不可取;快速幂算法就是将大数的幂运算拆解成了相对应小数的乘法运算。
class Solution {
public:
double Power(double base, int exponent) {
if(exponent==0) return 1.0;
if(base>-0.000001&&base<0.000001) /*如果base=0输出0 */
return 0;
double result=1.0;
if(exponent<0)//exponent为负数时将它转为正
{
exponent=-exponent;//转为正数
base=1/base;//分之一
}
while(exponent!=0)//依次连乘
{
/*exponent每减1,交替进入或不仅如此if条件,最终结果无误,可用4举例*/
if((exponent&1)==1)//&相当于%2,判断奇偶数
result*=base;
base*=base;
exponent>>=1;//等价于exponent--
}
return exponent>=0?result:1/result;
}
};