数值的整数次方

首先考虑了exponent为负数的情况。其次还特殊处理了当底数base为0而指数exponent为负数的情况。如果没有特殊处理,就有可能出现除数为0的情况。这里用一个全局变量来标识是否出错。

最后需要指出的是:由于0^0次方在数学上没有意义,因此无论是输出0还是1都是可以接受的,但需要在文档中说明清楚。

还有一个小细节需要注意:在判断底数base是否为0时,不能直接写base == 0,因为在计算机内表示小数时会有误差。判断小数(float、double)是否相等,只能判断它们之差是否在一个很小的范围内,如果相差很小,就可以认为它们相等。

此时已经考虑的很周详了,已经能够达到很多面试官的要求了。但如果碰到的面试官是一位在效率上追求完美的人,那么他有可能会提醒我们函数PowerWithUnsignedExponent还有更快的方法。

要求出一个数字的32次方,如果我们已经知道了它的16次方,那么只要在16次方的基础上再平方一次就可以了。而16次方是8次方的平方。这样以此类推,我们求32次方只需要做5次乘法:先求平方,在平方的基础上求4次方,在4次方的基础上平方求8次方,在8次方的基础上求16次方,最后在16次方的基础上求32次方。

也就是说,可以用如下公式求a的n次方:

这个公式很容易就能用递归来实现。新的PowerWithUnsignedExponent代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14

double PowerWithUnsignedExponent ( double base , unsigned intexponent )

{

     if ( exponent == 0 )

         return 1 ;

     if ( exponent == 1 )

         return base ;

 

     double result = PowerWithUnsignedExponent ( base , exponent >> 1 ) ;

     result *= result ;

     if ( exponent & 0x1 == 1 )//a & 0x1相当于a%2 

         result *= base ;

 

     return result ;

}

这里用右移运算符代替了除以2,用位与运算符代替了求余来判断奇偶,位运算比乘除法和求余运算效率高很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值