牛客网刷题笔记记录。参考自:https://cuijiahua.com/blog/2017/11/basis_12.html
一.题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
二.思路分析
当底数为0时没有数学意义,直接返回0.
当底数不为0时,讨论指数的情况:如果指数大于0则直接利用循环求得结果;指数等于0则结果为1;指数小于0则先计算指数的绝对值次幂的结果,然后再求倒数。
注:在阅读参考的资料中发现我疏忽了一个问题:由于计算机表示小数(包括float和double型小数)都有误差,我们不能直接用等号(==)判断两个小数是否相等。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等。并且python中的等于是没有误差的!
三.编程实现
C++实现:
自己的实现:虽然通过了所有的测试用例,但感觉写的有一点蠢,没有任何优化!
class Solution {
public:
double Power(double base, int exponent) {
if(base==0)
return 0;
double result=base;
if(exponent>0)
{
for(int i=1;i<exponent;i++)
{
result*=base;
}
}
else if(exponent==0)
{
result=1;
}
else
{
for(int i=1;i<-exponent;i++)
{
result*=base;
}
result=1/result;
}
return result;
}
};
参考的实现:
在计算次方的时候,除了简单的遍历,我们可以使用如下公式进行计算,来减少计算量:
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;
}
double result = PowerWithUnsignedExponent(base, exponent >> 1);
result *= result;
if(exponent & 0x1 == 1){
result *= base;
}
return result;
}
};