劍指offer編程題 -- 數值的整數次方

題目描述:

給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。

初看這道題,覺得很簡單,但其實需要考慮多種情況:

  1. base爲0時,結果爲0;
  2. exponent < 0 ;exponent = 0; exponent >0三種情況下的計算。

方案1:

class Solution {

public:

    double Power(double base, int exponent) {

       double result = 1;

       if(base == 0){

           return 0.0000;

       }

       if(exponent > 0){

       for(int i=1;i<=exponent;i++){

           result = result*base;

       }

       }

       else if(exponent == 0){

           result = 1.00000;

       }

       else{

           exponent = -exponent;

           for(int i=1;i<=exponent;i++){

               result = result*base;

           }

           result = 1.0/result;

       }

        return result;

    }

};

運行時間:3ms

佔用內存:460K

 

注意:機器中浮點數的比較是有誤差的,因此double類型的比較,不能用簡單的base==0來比較,一般的比較方式是,相減的差在一個很小的區間內,我們就認爲是相等的。

即if(base == 0){

           return 0.0000;

       }

修改爲:

if(base >= -0.000001 && base <= 0.00001){

           return 0.0000;

       }

 

方案2:根據指數的二進制表達,通過&1和>>1來逐位讀取,爲1時將該位代表的乘數累成到最終結果。

Eg:10 ^1101 = 10^0001 * 10^0100 *10^1000

class Solution {

public:

    double Power(double base, int exponent) {

       double result = 1;

       int n;

       if(base >= -0.000001 && base <= 0.000001){

           return 0;

       }

       if(exponent == 0){

           return  1.00000;

       }

       if( exponent >0){

           n = exponent;

       }

       else{

            n = -exponent;

        }

       while(n != 0){

       if(n & 1 == 1){

           result = result*base;

       }

              base = base*base;

              n >>= 1;

          }

        return exponent>0?  result:1/result;  #注意該運算符的使用

    }

};

運行時間:3ms

佔用內存:480K

 

參考鏈接:

https://blog.csdn.net/qq_23217629/article/details/51729501

https://blog.csdn.net/u011514810/article/details/52754884?utm_source=blogxgwz5

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章