数值的整数次方:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
解法一:使用循环来求
分析:注意考虑特殊情况,当底数为0,如果指数是正整数,则可以返回1,如果底数为0,指数是负整数,那么就会出错,而且如果底数不是0,指数是负整数,则返回的应该是底数和正整数运算结果的倒数。因此要考虑齐全。
double PowerWithUnsignedExponent(double base,unsigned int exponent){
double result = 1.0;
for(int i=1;i<=exponent;i++)
result *= base;
return result;
}
double Power(double base, int exponent) {
g_InvalidInput = true;
if(base - 0.0 <= 1e-6 && exponent < 0){
g_InvalidInput = false;
return 0.0;
}
unsigned int absExponent = (unsigned int)exponent;
if(exponent<0){
absExponent = (unsigned int)(-exponent);
}
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent<0)
result = 1/result;
return result;
}
解法二:使用公式
a^n = a^(n/2)* a^(n/2)(当n为偶数的时候)
a^n = a^(n-1)/2 * a^(n-1)/2(当n为奇数的时候)
采用递归形式,每次求出resultresult,比如25方就先计算21=2,22=2*2=4,24=44=16,最后多计算一次16*2=32,因此判断奇数的条件是在最后一次才有判断成功多乘一个的可能。
判断奇数采用的是exponent&0x01 = 1,除2采用的是位运算,exponent>>1
double PowerWithUnsignedExponent2(double base,unsigned int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result = PowerWithUnsignedExponent2(base,exponent>>1);
result *= result;
if(exponent & 0x01 == 1){
//说明是奇数
result *= base;
}
return result;
}
来源:CSDN
作者:蛮夷小王爷
链接:https://blog.csdn.net/weixin_37549298/article/details/102730276