剑指 Offer JZ12 数值的整数次方
Posted 程序字母K
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer JZ12 数值的整数次方相关的知识,希望对你有一定的参考价值。
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
方法一:
直接用库
//c++11支持,此类型次方
pow(base,exponent);
方法二:
次方(exponent)为几,base就乘几次;
if(exponent<0){
base=1/base;
exponent=-exponent;
}
double ret=1.0;
while(exponent--){
ret*=base;
}
return ret;
方法三:
调用递归
if(exponent==0) return 1.0;
double res=1.0;
if(exponent>0){
while(exponent--) res*=base;
return res;
}else
return 1/Power(base,-exponent);
方法四:
递归:be==be/2 * be/2
if(exponent==0) return 1.0;
if(exponent<0){//把exponent转为正
base=1/base;
exponent=-exponent;
}
double ret=Power(base,exponent/2);
if(exponent&1){//奇数
//if(exponent%2==1){
return base*ret*ret;
}else{
return ret*ret;
}
方法五:
这个方法和STL库的方法相同;
be : e的二进制每一位为1,就乘入;
假设求图片说明 ,已知6可以表示成二进制110
从每一个二进制开始,次方e不断向右移,当为1时,x为当前b * b*…为这个二进制为1的数的次方;
//转换为>0
if(exponent<0){
base=1/base;
exponent=-exponent;
}
double x=base;//记录base^0,base^1,base^2...
double ret=1.0;
while(exponent){
if(exponent&1){
ret*=x;//二进制位是1的,乘进去;
}
x*=x;//不断增大base*base*base...
exponent>>=1;//二进制位移动
}
return ret;
STL库的源代码
//STL标准库源码
template <class T,class Integer, class MonoidOperation>
T power_this(T x, Integer n, MonoidOperation op){ // 可以看成求pow(x, n)
if (n == 0)
return identity_element(op); // 可以看成 1
else{
while ((n & 1) == 0){
n >>= 1;
x = op(x, x); //op看成乘法
}
T result = x; // 遇到 二进制中从低位到高位的第一个 1
n >>= 1;
while (n != 0){
x = op(x, x);
if ((n & 1) != 0)
result = op(result, x);
n >>= 1;
}
return result;
}
}
以上是关于剑指 Offer JZ12 数值的整数次方的主要内容,如果未能解决你的问题,请参考以下文章