# 面试题:数值的整数次方
/*
题目: 实现函数 double Power(double base, int exponcent).
求base 的exponcent 次方。不得使用库函数,同时不需要考虑大数问题。
*/
题目分析:
乍一看,这不就是我们经常用的 pow 函数嘛! 那还不简单,于是大家立马就能写出下面这个函数(递归也可以)
double Power(double base, int exponcent)
{
int i = 0;
double ret = 1.0;//注意返回值类型;
for(i = 0; i < exponcent ; i++)
{
ret *= base ;
}
return ret;
}
@ 是不是和你现在想的一样, 先别高兴太早! 你输入个负数试试看! 0 次方是不是也没考虑! 懵逼了吧! 那就
静下来好好将各种情况处理;
@ 强调两点: 第一点,注意double类型数据的误差; 第二点: 指数为负数的次方,应该将 取指数的绝对值求值,
然后取倒数输出;
考虑较为全面的算法如下:
double PowerMeans(double base,unsigned int exponcent)//Power的实现手段函数
{
int i =0;
double ret = 1;
for(i = 0; i < exponcent ; i++)
{
ret = base*ret;
}
return ret;
}
double Power(double base, int exponcent)
{
double ret = 1.0;
unsigned int abs = 0;
/*
注意double类型的误差分析;
*/
if((base - 0.0)> -0.0000001 && (base - 0.0) < 0.0000001&& exponcent < 0)
return 0.0;
abs = (unsigned int)(exponcent );
if(exponcent < 0)//指数为负数的情况;
abs = (unsigned int)(-exponcent );
ret = PowerMeans (base,abs);
if(exponcent < 0)
ret = 1.0/ret;//取倒数;
return ret;
}
# 是不是感觉看着全面多了, 可是,如果你碰到的面试官是个对效率要求比较高的人,那么, 他肯定会提醒你看
看PowerMeans 函数还可不可以优化!
那么,问题就来了, 怎么可以更快呢! 仔细看, 如果求 2^32 是不是可以先把2^16 求出来相乘,以此类推,总共
需要做5次乘法;
@ 注意 ; 如果指数是奇数,那么最后还得乘一次 base; 以 2^31次方类比一下就可以得出;
我们用递归实现PowerMeans 函数:
double PowerMeans(double base, int exponcent)
{
double ret = 1.0;
if(exponcent == 0)
return 0;
if(exponcent == 1)
return base;
ret = PowerMeans (base,exponcent >> 1);
ret *= ret;
if((exponcent & 1) == 1)//判断指数的奇偶性;
ret *= base;
return ret;
}
Ps : 不动起来,你永远不知道自己有多棒!
over!
Thank!