- 题目描述:
-
给定一个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了 } } }
结果图
-