《剑指offer》面试题16:数值的整数次方

面试题16:数值的整数次方


小白一枚,仅为记录,欢迎指正!!

题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

1.全面但不够高效的解法,需要注意的是边界值:

(1) 当指数为负数时,可以先对指数求绝对值,算出次方的结果后再求倒数;但需要考虑到底数为0,指数为负时,不能除以0
(2) 0的0次方在数学上是没有意义的,输出可以是0或者1,面试时需要说清
代码片1.

// An highlighted block
public class Solution {
	public double Power(double base, int exponent){
		boolean flag = false;
		double result=1;
		if(exponent<0){
			if(base==0){
				System.out.println("异常:底数为0,指数为负,无意义");
				return 0.0;//此时返回的0是异常时的0
			}
			flag = true;
			exponent = Math.abs(exponent);	
		}
		int i = 0;
		//此处while可以用代码2代替
		while(i<exponent){
			result = result*base;
			++i;
		}
		if(flag){
			return 1/result;
		}else{
			return result;
		}	
	}

}

2.既全面又高效的解法,用递归实现,此段代码可以代替while循环
思路: 要计算一个数的32次方,如果已经知道他的16次方的值了,只用把它的16次方的值平方一次就可以了。而16次方又是8的平方,这样依次类推,求一个数的32次方只要进行做5次乘法就够了。
  先求平方,在平方的基础上求4次方,在4次方的基础上求8次方,在8次方的基础上求16次方,在16次方的基础上求32次方。 
代码片2.

    public double baseExponentPower(double base, int exponent){
        if(exponent==0)
			return 1;
		if(exponent==1)
			return base;
		double result = baseExponentPower(base, exponent>>1);
		result*=result;
		if((exponent & 0x1) == 1)
			result *= base; 
		return result;
		
	}

用右移运算代替除以2用位与运算符代替求余运算符%来判断一个数是奇数还是偶数,位运算的效率比乘除及求余的运算要高很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值