题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
对于这道题,要考虑四种情况:
1、底数为0,指数为负数的情况,无意义
2、指数为0,返回1
3、指数为负数,返回1.0/base,-exponent
4、指数正数,base,exponent
第一反应我们会写出来的代码:
class Solution {
public:
double Power(double base, int exponent) {
double re=1.0;
for(int i=1;i<=exponent;i++){
re*=base;
}
return re;
}
};
但如果输入的指数(exponent)小于1,即是0和负数的时候怎么办?上面的代码完全没有考虑,只包括了指数为正数的情况。
进阶版代码:
我们知道当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然的就要想到有没有可能对0求倒数,如果对0求倒数怎么办?当底数base是零且指数是负数的时候,我们不做特殊的处理,就会发现对0求倒数从而导致程序运行出错。怎么告诉函数的调用者出现了这种错误?在Java中可以抛出异常来解决。
最后需要指出的是,由于0的0次方在数学上没有意义的,因此无论是输出0还是1都是可以接收的,但这都需要和面试官说清楚,表明我们已经考虑到了这个边界值了。
有了这些相对而言已经全面很多的考虑,我们就可以把最初的代码修改如下:
class Solution { public: double Power(double base, int exponent) { double re=1.0; if(exponent==0) return 1.0; if(base==0) return 0; if(exponent<0){ base=1.0/base; } while(exponent){ exponent=(exponent<0)?(++exponent):(--exponent); re*=base; } return re; } };
上面代码运行时间是3ms,内存472k
优化求幂函数
当n为偶数,a^n =(a^n/2)*(a^n/2)
当n为奇数,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
时间复杂度O(logn)
参考资料: