【题目】给定一个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)还有更优的方法,由于没有完全明白,在此就不叙述了。
时间: 2024-10-07 20:11:08