《劍指offer》之求數的整數次冪

《劍指offer》之求數的整數次冪

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

分析:求解數的次方可以使用二進制來進行計算。例如:

10^1101 = 100001*100100*10^1000。
即:通過&1和>>1來逐位讀取1101,爲1時將該位代表的乘數累乘到最終結果。

解決方案:

  • 暴力計算法:

    代碼:

    public double Power(double base, int exponent) {
        double  result=1;
        for(int i=0;i<Math.abs(exponent);i++){
            result*=base;
        }
        if(exponent<0){
            result=1/result;
        }
        return result;            
    }
    

    測試性能分析:

    運行時間:63ms
    佔用內存:10388k
    
  • 二進制

    代碼:

    public double Power(double base, int n) {
        double res = 1,curr = base;
        int exponent;
        if(n>0){
            exponent = n;
        }else if(n<0){
            if(base==0)
                throw new RuntimeException("分母不能爲0"); 
            exponent = -n;
        }else{// n==0
            return 1;// 0的0次方
        }
        while(exponent!=0){
            if((exponent&1)==1)
                res*=curr;
            curr*=curr;// 翻倍
            exponent>>=1;// 右移一位
        }
        return n>=0?res:(1/res);       
    }
    

    性能測試分析:

    運行時間:68ms
    佔用內存:10432k
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章