Java 算法-快速冪

??說實話,自己是第一次接觸到快速冪這種東西,覺得有必要記錄下來。

題意:
計算a^n % b,其中a,b和n都是32位的整數(shù)。
樣例:
例如 2^31 % 3 = 2

例如 100^1000 % 1000 = 0
挑戰(zhàn):
O(logn)

1.解題思路

??在介紹這個題的解題思路之前,我先來簡單的介紹一下,什么是快速冪?

(1).快速冪

??快速冪,顧名思義就是快速的求次冪,例如:a^b,普通的算法就是累乘,這樣的計算方法的時間復(fù)雜度就是O(n),而快速冪的方法使得次冪的計算方法的時間復(fù)雜度降低到O(logn).
??假設(shè)我們要求a^b的結(jié)果,這里我們可以將b轉(zhuǎn)換為二進制來求。例如:

                    a^11 = a(2  ^ 0 + 2 ^ 1 + 2 ^ 3) = a ^(1011);

??所以,我們得出結(jié)果:a^11 = (a ^ (2 ^ 3)) *( a ^(2 ^ 1)) *( a^(2 ^ 0));
也就是說,我們只要把次冪化成二進制數(shù),那么我們操作起來就非常的簡單了。怎么化成二進制呢?在位運算符中,>>符號表示將一個數(shù)字右移一位,也就是說,我們這里可以通過這個符號來一位一位的計算(這里講的是二進制數(shù),當十進制數(shù)使用這個符號來操作的話,我們可以將十進制數(shù)當成二進制數(shù)右移)。同時我們還可以使用&符號來看看我們二進制數(shù)的最后一位數(shù)是不是0,比如 a & 1 == 0,表示的是a的二進制數(shù)的最后一位是0,反之就是不為0.這里清楚了這一點的話,下面的代碼就非常的容易理解。
??這里我來舉一個例子,例如,我們想要求a ^ b的結(jié)果,按照快速冪的求法,代碼如下:

public int fastPower(int a, int b) {
        int ans = 1;
        int base = a;
        while (b != 0) {
            if ((b & 1) != 0) { //如果當前的次冪數(shù)最后一位(二進制數(shù))不為0的話,那么我們將當前權(quán)值加入到最后答案里面去
                ans = ans * base;
            }
            //權(quán)值增加
            base = base * base;
            b >>= 1;
        }
        return ans;
    }

(2).取模

??但是這個題不是簡單的快速冪,而是需要求余數(shù),理解到了上面的快速冪的求法,那么這里就非常的簡單,就是在計算的時候在取一次模就行了。

public int fastPower(int a, int b, int n) {
        if (n == 0) {
            return 1 % b;
        }
        long ans = 1l;
        long base = a % b;
        while (n != 0) {
            if ((n & 1) == 1) {
                ans = (ans * base) % b;
            }
            //為了避免超出long的范圍,所以取三次模
            base = (base % b) * (base % b) % b;
            n >>= 1;
        }
        return (int) ans;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼,而且,這類問題常常是因為編碼方式問題,主要原因...
    波段頂?shù)?/span>閱讀 3,334評論 1 9
  • 姓名:李浩然 學(xué)號:16030410020 轉(zhuǎn)自:http://blog.csdn.net/Dreaming_My...
    洛花無閱讀 2,777評論 0 1
  • 在那一場大雨中 我突然 想放開他的手 他的模樣在雨中 有些看不清了 只記得 他淺淺的笑 說著再也不見了吧 再也不見...
    小鬼丫閱讀 361評論 0 2

友情鏈接更多精彩內(nèi)容