演算法學習記錄十(C++)--->數值的整數次方

Deft_MKJing宓珂璟發表於2017-08-11

描述

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

分析

1.普通方法,幾次方就是乘以幾次
2.位運算解法

普通解法

class Solution {
public:
    double Power(double base, int exponent) {
        double ret = 1;
        if(exponent == 0){
            return 1.0f;
        }
        else if(exponent < 0){
            while(exponent!=0){
                ret /= base;
                exponent++;
            }
        }
        else{
            while(exponent!=0){
                ret *= base;
                exponent--;
            }
        }
        return ret;

    }
};

位運算

  • 1.全面考察指數的正負、底數是否為零等情況。
  • 2.寫出指數的二進位制表達,例如11表達為二進位制1011。
  • 3.舉例:10^1011 = 10^0001*10^0010*10^1000。
  • 4.通過&1和>>1來逐位讀取1011,為1時將該位代表的乘數累乘ret到最終結果。 每位移一次都要翻倍
class Solution {
public:
    double Power(double base, int exponent) {
        double ret = 1.0f; // 初始
        double cur = base; 
        int ex = 0;
        if(exponent==0){
            return 1.0f;
        }
        else if(exponent>0){
            ex = exponent;
        }
        else{
        // 負數的時候分母要處理下
            if(base==0){};
            ex = -exponent;
        }
        // 指數位運算向右移動,不等於0的時候累乘
        while(ex){
            // 位運算中遇到1代表一次累乘
            // 3.舉例:10^1011 = 10^0001*10^0010*10^1000。
            if((ex&1)==1){
                ret *= cur;
            }
            // 每次位移都要翻倍10^0,10^1,10^2,10^4,10^8
            cur *= cur;
            // 這裡一定要重新給ex賦值,不然死迴圈了
            // ex>>1這樣的話ex不會變的,沒注意,會死迴圈
            ex>>=1;
        }
        return exponent>0?ret:1/ret;
    }
};

相關文章