给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
剑指offer
class Solution {
public:
double Power(double base, int exponent) {
double result = 1.0;
int absexponent = exponent;
if (absexponent < 0){
if(equal(base, 0.0)) cerr << "输入无效的数据\n"; //对于精度要求高的,不能用==判断是否等于
absexponent = -exponent;
}
if (absexponent == 0)
return 1; //n==0时0的0次方没有意义,此处将0的0次方结果定义为1
while (absexponent){
if (absexponent & 0x1 == 1) //当absexponent为奇数时
result *= base;
base *= base;
absexponent >>= 1; //absexponent = absexponent >> 1; absexponent 除以2
}
return exponent >= 0 ? result : 1.0 / result;
}
bool equal(double num1, double num2){
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001))
return true;
else
return false;
}
};
leetcode
超时(20200528)
/*
分析n>0,n=0,n<0的情况
*/
class Solution {
public:
double powUnsignedExponent(double x, int n) {
double a = x;
double result = 1.0;
if (n == 1)
result = a;
if ((n & 1) == 0) {//为偶数时
while (n >> 1)
x *= x;
result = x;
}
else {//为奇数时
n = n - 1;
while (n >> 1)
x *= x;
result = a * x;
}
return result;
}
double myPow(double x, int n) {
double res = 1.0;
if (n < 0) {//第一种情况
if (x == 0)
cerr << "Invalid Input" << endl;
else
n = -n;
}
if (n == 0) { //第二种情况
if (x == 0)
cerr << "Meaningless Input" << endl;
else
return res;
}
else
res = powUnsignedExponent(x, n);
return n >= 0 ? res : 1.0 / res;
}
};
快速幂
class Solution {
public:
double myPow(double x, int n) {
if (x == 0)//避免后续 x = 1/x 操作报错
return 0;
double res = 1;
if (n < 0) {
n = -n;
x = 1 / x;
}
while (n) {
if (n & 1) //n % 2 == 1
res *= x;
x *= x; //x = x^2
n >>= 1; //n = n / 2
}
return res;
}
};
此时会报错:
是因为当n=-2147483648,-n已经超出了int范围,故此处应注意:
class Solution {
public:
double myPow(double x, int n) {
if (x == 0)//避免后续 x = 1/x 操作报错
return 0;
double res = 1;
long b = n;
if (b < 0) {
b = -b;
x = 1 / x;
}
while (b) {
if (b & 1) //n % 2 == 1
res *= x;
x *= x; //x = x^2
b >>= 1; //n = n / 2
}
return res;
}
};