• 剑指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)还有更优的方法,由于没有完全明白,在此就不叙述了。

  • 相关阅读:
    《完美应用ubuntu》之全面管理ubuntu软件源
    ubuntu下安装CAJ阅读器
    re正则表达式方法
    Xpath做数据解析
    C++异常处理
    异常处理
    指针与引用
    总结:开放透明的环境对于大数据团队的重要性
    java控制流
    3. 最小生成树
  • 原文地址:https://www.cnblogs.com/noaman/p/5398219.html
Copyright © 2020-2023  润新知