剑指Offer 面试题16:数值的整数次方 Java代码实现

题目:实现函数double power( double base, int exponent),求base的exponent次方。不得使用库函数,同时需要考虑大数问题。

大体思路很简单啊,就是base做exponent次相乘就好了。但是我们需要全面,比如base为0,指数为复数,这些情况怎么处理。数学上,0的0次是没有意义的,我们这儿返回0。当指数为负数的时候,可以先求base的 |exponent| 次幂,然后取到数。


上述思路的Java代码实现如下:

static double power(double base , int exp){
		if(base==0)
			return 0;
		int absExp=Math.abs(exp);
		
		double result=powerWithUnsignedExp(base,absExp);
		if(exp<0){
			result=1.0/result;
		}
		return result;
	}
方法中,用了powerWithUnsignedExp(double base, int absExp),这是用来计算一个数的正整数次幂的方法,实现如下:

private static double powerWithUnsignedExp(double base, int absExp) {
		double result=1;
		for(int i=1;i<=absExp;i++){
			result*=base;
		}
		return result;
	}


利用幂次运算的规则,a^n=a^n/2*a^n/2,n为奇数是先提一个a出来,就转成偶数一样了。还可以减少计算次数,可以修改powerWithUnsignedExp(double base, int absExp)如下:

private static double powerWithUnsignedExp2(double base,int absExp){
		if(absExp==0)
			return 1;
		if(absExp==1)
			return base;
		
		double result=powerWithUnsignedExp(base, absExp>>1);
		result*=result;
		if((absExp&0x1)==1)
			result*=base;
		
		return result;
	}
代码中用移位运算(absExp>>1)代替除法,提高效率。


测试代码如下:

public static void main(String[] args) {
		double[] baseArr={-2,0,2};
		int[] expArr={-2,0,2};
		for(int i=0;i<baseArr.length;i++){
			for(int j=0;j<expArr.length;j++){
				System.out.print(power(baseArr[i], expArr[j]));
				System.out.print(", ");
			}
		}
	}

输出如下:

0.25, 1.0, 4.0, 0.0, 0.0, 0.0, 0.25, 1.0, 4.0, 

改变pow方法中的powerWithUnsignedExp 实现方式,得到结果一致。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值