剑指offer 16 数值的整数次方
程序员文章站
2022-06-17 17:10:20
...
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
分析:
1、首先要考虑基数base是否等于0,等于零时,其exponent次方是无意义的,所以等于零或者等于1都无所谓
2、考虑exponent的正负。当exponent为负时,最后结果要取倒数
3、当base==0,并且expinent为负数时,就是0作了除数,会出现错误,需要利用返回值或者全局变量或异常返回错误。
考虑到这些,代码可以写为:
class Solution {
public:
bool invalid=false;
double Power(double base, int exponent) {
if((base==0.0)&&exponent<0)
{
invalid=true;//利用invalid用以区分返回错误return0.0与真正的值返回0.0
return 0.0;//利用返回值进行错误处理。
}
unsigned int absexponent=(unsigned int )(exponent);
if(exponent<0)
unsigned int absexponent=(unsigned int )(-exponent);//因为题目要求不能使用库函数
double result=powerwithexponent(base,absexponent);
if(exponent<0)
result=1/result;
return result;
}
double powerwithexponent(double base,unsigned int exponent)
{
double result=1.0;
for(int i=1;i<=exponent;++i)
result*=base;
return result;
}
};
更高效的写法:
class Solution {
public:
bool invalid=false;
double Power(double base, int exponent) {
if((base==0)&&(exponent<0))
{
invalid=true;//利用invalid用以区分返回错误return0.0与真正的值返回0.0
return 0.0;//利用返回值进行错误处理。
}
int absexponent=abs(exponent);
double result=powerwithexponent(base,absexponent);
if(exponent<0)
result=1/result;
return result;
}
double powerwithexponent(double base,int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
//递归
double result=powerwithexponent(base,exponent>>1);//利用向右移位操作代替/2操作,提高效率
result*=result;
//判断奇偶性
if(exponent&0x1==1)//利用位&操作代替%运算,判断奇偶数
result*=base;
return result;
}
};
上一篇: 状态模式(形式一)
下一篇: 理解简单工厂模式和策略模式的区别
推荐阅读
-
剑指offer11:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。(进制转换,补码反码)
-
剑指offer JZ31 整数中1出现的次数 Python 解
-
剑指Offer16_数值的整数次方(快速幂及拓展)
-
【剑指offer】_11整数中1出现的次数
-
【剑指offer】_08.数值的整数次方
-
剑指offer两个面试案例 把字符串转换成整数 树中两个节点的最低公共祖先
-
【LeeCode 中等 数学 python3】剑指 Offer 43. 1~n整数中1出现的次数
-
剑指offer JZ53 表示数值的字符串 Python 多解
-
剑指offer 从1到n整数中1出现的次数
-
剑指offer32题:整数中1出现的次数(从1到n整数中1出现的次数)