数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 —— [ 牛客网 ]
本题目考察的是代码的完整性,实现求方的函数,需要考虑程序的边界值。首先需要想到的特殊的情况有以下的几个方面:
- exponent为0,base不为0,结果为1
- exponent为0,base为0,这种情况实际情况中并不存在,可选择抛出异常或者返回特定值
- exponent为正,base为0,结果返回0
- exponent为负,base为0,结果应该抛出异常或者返回特定值
考虑以上的特殊情况,要考虑exponent的正负两种情况,计算公式如下:
be={be,1/b−e,if e is positive if e is negative
而题目让实现求幂的计算方法,按照最常规的思路,则有以下的代码。
解法一
class Solution {
public:
double Power(double base, int exponent) {
if(base == 0 && exponent != 0)return 0;
if(base != 0 && exponent == 0)return 1;
if(base == 0 && exponent == 0)return 1;
if(base == 1)return 1;
double ans = 1.0;
int n = abs(exponent);
for(int i = 1 ;i <= n ; i++ ){
ans *= base;
}
return exponent > 0 ? ans : 1/ans;
}
};
进一步的思考
针对数值求幂的运算,可以用更快的算法,而我们使用的思路一是如下所示:
bn={bn/2∗bn/2,bn−1/2∗bn−1/2∗b,if e is odd if e is even
思路二用另一种表达方式可以看作是,假设 n=5 , n 的二进制表示101,那么
若判断每一位是0,还是1,选择是否乘以相应的数值,这也是用移位和与与运算实现思路一。
解法二
class Solution {
public:
double Power(double base, int exponent) {
if(base == 0 && exponent != 0)return 0;
if(base != 0 && exponent == 0)return 1;
if(base == 0 && exponent == 0)return 1;
if(base == 1)return 1;
double ans = 1.0;
int n = abs(exponent);
double curr = base;
while(n){
if(n & 1)ans *= curr;
curr *= curr;
n >>= 1;
}
return exponent > 0 ? ans : 1/ans;
}
};