數值的整數次方

帥地發表於2019-03-15

前言

本來是打算次條每天更新面試題和演算法刷題的,加上頭條一共要三篇文章,實在更不來,而且兩篇都看的人也不多,所以我就演算法刷題和麵試題論著更新,更新的時候多更新幾道。

題目描述

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

解答

方法1:暴力法

這道題就簡單的方法就是暴力法了,就是讓 base 乘以 exponent 次 base。

程式碼如下:

    public double Power(double base, int exponent) {
        // 任何數的 0 次方都是 1(0除外,不過題目並沒有說 base=0時怎麼處理)
        if (exponent == 0) {
            return 1;
        }
        double temp = base;
        int n = exponent;
        if (n < 0) {
            n = -n;
        }
        for (int i = 1; i < n; i++) {
            base *= temp;
        }
        return exponent < 0 ? 1 / base : base;
    }

方法2:位運算

我直接舉個例子吧,例如 base = 2, exponent = 13,則 exponent 的二進位制表示為 1101, 那麼 2 的 13 次方可以拆解為:

2^1101 = 2^0001 * 2^0100 * 2^1000。

我們可以通過 & 1和 >>1 來逐位讀取 1101,為1時將該位代表的乘數累乘到最終結果。

程式碼如下:

    public double Power(double base, int exponent) {
        if(exponent == 0)
            return 1.0;
        int n = exponent;
        if (n < 0) {
            n = -n;
        }
        double sum = 1;
        double temp = base;
        while (n != 0) {
            if ((n & 1) != 0) {
                sum *= temp;
            }
            temp *= temp;
            n = n >> 1;
        }
        return exponent < 0 ? 1 / sum : sum;
  }

其實有很多題是可以利用位的異或來解決的,大家可以思考下平時遇到哪些題是用這種方法解決的,我後面會給出幾道題,這些題都可以用異或位運算巧妙解決。發的另一道題也用到了位運算。

其實我是想跟大家說,做題的時候,有時候想想是否可以用位運算來解決。

相關文章