剑指offer--算法题--13--数值的整数次方

题目描述:

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

输入:

输入可能包含多个测试样例。
对于每个输入文件,第一行输入一个整数T,表示测试案例的数目,接下来的T行每行输入一个浮点数base和一个整数exponent,两个数中间用一个空格隔开。

输出:

对应每个测试案例,

输出一个浮点数代表答案,保留两位小数即可。

在这里我就不说第一种方法了,第一种方法无非就是考虑好指数的大小 比如为0 为负数 为整数时候的情况,然后遍历指数每次乘一个底数就可以了,这样我们就成功了。

第二种方法就是一个优化 比如我们要求32次方的话 我们可以先求出16次方 再乘16次方就是 32次方  同理我们要求32次方的话,先求出16次方,求16次方 先求出8次方 ,,求8次方 先求出4次方,,求4次方 先2次方 ,依次类推,就是一个递归的过程。

下面上代码

package jzoffer;

public class E11Power {
	public static void main(String[] args) throws Exception {
		E11Power ep = new E11Power();
		System.out.println("对3的-1次幂求解:");
		System.out.println("用第一种方法实现的结果如下:"+ep.power1(3, -1));
		System.out.println("用第二种方法实现的结果如下:"+ep.power2(3, -1));
	}
    public double power1(double base,int exponent) throws Exception{
    	double result = 0.0;
    	if(equal(base, 0.0) && exponent < 0){
    		throw new Exception("0的负数次幂无意义");
    	}//第一步当然先判断底数是不是为0 并且指数是不是为负数
    	if(equal(exponent,0)){
    		return 1.0;//如果我们的指数为0的话那么,结果不用算肯定就是1.0了
    	}//第二步指数为0 底数不用判断结果就定了
    	if(exponent < 0){//如果仅仅是指数为负数的话
    	result = 	powerWithExponent1(1.0/base, -exponent);
    		//如果指数为负数的话,那么我们只需要将底数取倒
    		//然后该多少次方就多少次方就好了
    	}else{
    		powerWithExponent1(base, exponent);
    	}//那么这里就是正常的情况了
    	return result;//返回result
    }
    public double power2(double base,int exponent) throws Exception{
    	double result = 0.0;
    	if(equal(base, 0.0) && exponent < 0){
    		throw new Exception("0的负数次幂无意义");
    	}//第一步当然先判断底数是不是为0 并且指数是不是为负数
    	if(equal(exponent,0)){
    		return 1.0;//如果我们的指数为0的话那么,结果不用算肯定就是1.0了
    	}//第二步指数为0 底数不用判断结果就定了
    	if(exponent < 0){//如果仅仅是指数为负数的话
    	result = 	powerWithExponent2(1.0/base, -exponent);
    		//如果指数为负数的话,那么我们只需要将底数取倒
    		//然后该多少次方就多少次方就好了
    	}else{
    		powerWithExponent2(base, exponent);
    	}//那么这里就是正常的情况了
    	return result;//返回result
    }
    private double powerWithExponent1(double base,int exponent){
    	double result = 1.0; //这里我们提供的方法一效率并不是很高
    	for(int i =1;i<=exponent;i++){
    		result = result*base;
    	}
    	return result;
    }
    private double powerWithExponent2(double base,int exponent){
    	double result = 1.0; //这里我们提供的方法二效率挺高的
    	if(exponent == 0){
    		return 1;
    	}
    	if(exponent == 1){
    		return base;
    	}
    	double result1 = powerWithExponent2(base, exponent/2);
    	result1 *= result1;
    	if(exponent%2 ==1){//判断是否为奇数 如果是奇数的话肯定要再*base
    		result *= base;
    	}
    	return result1;
    }
    private boolean equal(double num1,double num2){
    		if((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)){
    			return true;//这块我们为什么不能使用==直接判断他们相等那
    		}else{          //主要是因为double会有误差范围如果我们的精确度再高一点的话
    			return false;//那我们的==就永远是false了 
    		}
    }
    
}

结果图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值