题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
解题思路
本题,我刚开始看到题目时,有点没太明白题目的意思。
看别人的解析才知道,是int类型的exponent在计算机中用整数表示,然后需要实现这种求数值的次方函数。
那么,问题就清晰了。
影响次方操作的最关键性点,就是exponent的正负性、非0性、base的非0性等分类讨论:
- base=0,exponent=0,抛出异常;
- base=0,exponent != 0,返回0;
- base != 0:
- exponent为正,直接求 b a s e e x p o n e n t base^{exponent} baseexponent;
- exponent为负,先求, b a s e − e x p o n e n t base^{-exponent} base−exponent,再求 1 b a s e − e x p o n e n t \frac{1}{base^{-exponent}} base−exponent1;
- exponent=0,直接返回1;
源代码
class Solution {
public:
double Power(double base, int exponent) {
int flag=1;
double ans=1;
if(base==0){
if(exponent==0){
throw new invalid_argument("基数指数不能同时为0");
}
else{
return 0;
}
}
else{
if(exponent==0){
return 1;
}
if(exponent<0){
flag = -1;
exponent = -exponent;
}
while(exponent!=0){
if((exponent&1)==1)
ans*=base;
base*=base;// 翻倍
exponent>>=1;// 右移一位
}
return flag>=0?ans:(1/ans);
}
}
};
这里有个小注意点,循环求次方时,循环用exponent移位实现,而不用exponent-1,这样可以大幅度减少循环次数,提高程序性能。