剑指offer系列10---数值的整数次方

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

 * 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。

下面给出版本一:

 1 package com.exe3.offer;
 2 
 3 /**
 4  * 【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
 5  * 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。
 6  * @author WGS
 7  *
 8  */
 9 public class Power {
10     public double getPower(double base,int exponent){ 
11         double result=1;
12         if(exponent==0)
13             return 1.0;
14         if(exponent>0){
15             for(int i=0;i<exponent;i++){
16                 result *=base;
17             }
18         }else{
19             double absExponent=-exponent;
20             for(int i=0;i<absExponent;i++){
21                 result *=base;
22             }
23             result=1.0/result;
24         }
25         return result;
26         
27     }
28     public static void main(String[] args){
29         Power power=new Power();
30         double result=power.getPower(0, -2);
31         System.out.println(result);
32     }
33 }

将题中重复代码放至一个方法中:

1
package com.exe3.offer; 2 3 /** 4 * 【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 5 * 【思路】主要是考虑幂的正负数以及等于0三种情况。但是在处理的时候要考虑细致,底数等于0时无意义,这时候应该报异常。 6 * @author WGS 7 * 8 */ 9 public class Power { 10 public double getPower(double base,int exponent){ 11 double result=1; 12 if(exponent==0) 13 return 1.0; 14 if(exponent>0){ 15 result=powerWithExponent(base,exponent); 16 }else{ 17 double absExponent=-exponent; 18 result=powerWithExponent(base,absExponent); 19 result=1.0/result; 20 } 21 return result; 22 23 } 24 public double powerWithExponent(double base,double exponent){ 25 double result=1; 26 for(int i=0;i<exponent;i++){ 27 result *=base; 28 } 29 return result; 30 } 31 public static void main(String[] args){ 32 Power power=new Power(); 33 double result=power.getPower(0, -2); 34 System.out.println(result); 35 } 36 }

经测试可达到效果。但实际上此版本中有很多考虑不周的地方,第一,在判断exponent是否等于0时不能直接用==,计算机内部表示小数时有误差;第二,求幂运算时还有更优代码:

 1 package com.exe3.offer;
 2 
 3 public class Power2 {
 4     public double getPower(double base,int exponent){
 5         double result=1;
 6         //处理异常底数是0且指数是负数的情况
 7         if(equal(base,0.0)&&exponent<0){
 8             return 0.0;
 9         }
10         if(exponent>0){
11             result=powerWithExponent(base,exponent);
12         }else{
13             double absExponent=-exponent;
14             result=powerWithExponent(base,absExponent);
15             result=1.0/result;
16         }        
17         return result;         
18     }
19     
20     public double powerWithExponent(double base,double exponent){
21         double result=1;
22         for(int i=0;i<exponent;i++){
23             result *=base;
24         }
25         return result;
26     }
27     public boolean equal(double base,double d){
28         if((base-d<0.0000001)&&(base-d>-0.0000001)){
29             return true;//相等
30         }else{
31             return false;
32         }
33     }
34     public static void main(String[] args){
35         Power2 p2=new Power2();
36         double result=p2.getPower(0, -2);
37         System.out.println(result);
38     }
39 }

实际上,此处的powerWithExponent(double base,double exponent)还有更优的方法,由于没有完全明白,在此就不叙述了。

原文地址:https://www.cnblogs.com/noaman/p/5398219.html