题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
一、解题思路
本题在求base的exponent次方,很多人可能会通过一个for循环将base连乘,但是这样就忽略了exponent的正负和0的情况,以及当exponent为负数的时候,我们知道得到结果是正数的倒数,那么如果结果是0,我们再取倒数就会导致程序出错,因此我们需要分别考虑各种情况。
另外,当我们求base的32次方的时候,求得base的2次方后,我们就可以求base的4次方,之后就可以求base的8次方;这样求的好处在于减少了乘法操作,通过递归的形式很容易实现。
二、Java
代码
public class Solution {
public double Power(double base, int exponent) {
//当exponent等于0的时候,任何数的该次方都为1
if(exponent == 0){
return 1;
}
//当exponent等于1的时候,任何数的该次方都为本身
if(exponent == 1){
return base;
}
boolean isNegative = false;
//如果exponent为负数,将isNegative设为true
if(exponent < 0){
exponent = -exponent;
isNegative = true;
}
//递归调用
double pow = Power(base * base, exponent / 2);
//如果exponent为奇数,再乘以一个base
if(exponent % 2 != 0){
pow = pow * base;
}
return isNegative ? 1 / pow : pow; //判断标识符
}
}
三、C++
代码
class Solution {
public:
double Power(double base, int exponent) {
if(equal(base, 0.0))
{
return 0.0;
}
unsigned int absExponent = 0;
if(exponent > 0)
{
absExponent = (unsigned int)(exponent);
}
else
{
absExponent = (unsigned int)(-exponent);
}
double result = PowerWithUnsignedExponent(base, absExponent);
if(exponent < 0)
{
result = 1.0 / result;
}
return result;
}
private:
bool equal(double num1, double num2)
{
if(num1 - num2 > -0.0000001 && (num1 - num2) < 0.0000001)
{
return true;
}
else{
return false;
}
}
double PowerWithUnsignedExponent(double base, unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
//此处用右移运算符代替了除以2
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
//用与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数
if ((exponent & 0x1) == 1)
result *= base;
return result;
}
};
四、Python3
代码
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
# write code here
try:
result = self.power_value(base, abs(exponent))
if exponent < 0:
return 1.0 / result
except ZeroDivisionError:
print('Error: base is zero')
else:
return result
def power_value(self, base, exponent):
if exponent == 0:
return 1
if exponent == 1:
return base
result = self.power_value(base, exponent >> 1)
result *= result
if exponent & 1 == 1:
result *= base
return result