快速冪,就是冪運算的一種快速演算法,它的時間複雜度為
在了解快速冪之前,我們需要先了解一下傳說中的二進位制。
要知道,這個世界上只有10種人,一種是懂二進位制的人,另一種是不懂二進位制的人。(滑稽)
相對於十進位制, 我們生活中所用的是十進位制,滿十進一。那麼二進位制,顧名思義,就是滿二進一。
就像上上段的那個笑話一樣,10(讀作:一零)它其實是2,依此類推,100它是4,1000它是8,10000它就是16,而1它還是1。
看著上面的二進位制與十進位制的對照我們可以發現,二進位制的第i位它其實對應的就是十進位制中的
當我們知道了二進位制的第i位它其實對應的就是
下面以首先我們要把x轉換為二進位制數。
例如化簡可得
根據以上的證明,再加上c++中的位運算子我們就可以以一種很簡潔的**完成快速冪。
&與運算,它是乙個二元運算子,只有當兩個輸入的條件都為真,在二進位制中也就是都為1的時候才返回真(對應二進位制中的1)。
利用這個特性,我們可以判斷乙個整數的奇偶性。比如9和1,1001和0001分別對應9和1的二進位制,當他們進行與運算之後的結果顯然為0001,返回真,表示9是乙個奇數。顯然,奇數二進位制的最後一位都是1,偶數二進位制的最後一位都是0,把它們同1進行與運算就能判斷它們的奇偶性。
>>i右移運算,注意與cin輸入的》過載運算子區別!!!,它的含義是小數點不動,在二進位制下將數整體右移i位。
利用這個運算子,我們就可以用「>>1」實現去掉某個二進位制數的最後一位。
這時,我們再聯絡上前文所提到的知識,就可以寫出下面函式來進行冪運算:
int pow(int a,int x)
return r;
}
在一些題目,我們通常要對一些資料較大的結果進行取模運算。但是如果資料過大的話,就會超過變數的儲存範圍。但是我們根據下面乙個公式就可以很好的解決這個問題。
公式:
顯然,這個公式是成立的(手動滑稽),咳。
根據上面的公式我們可以得出
於是乎我們就可以針對上面的**進行優化,如下:
int pow(int a,int x,int c)
return r;
}
快速冪取模運算
1.如果b是偶數,我們可以記k a2 mod c,那麼求 k b 2 mod c 就可以了。2.如果b是奇數,我們也可以記k a2 mod c,那麼求 k b 2 mod c a mod c k b 2 mod c a mod c就可以了。那麼我們可以得到以下演算法 演算法4 int ans 1 a...
快速冪運算和快速冪取模運算
如果我們要求乙個數x的n次冪,樸素的想法是讓n個x相乘。對與n很大的情況,會造成一定的時間浪費。這裡講解一下o nlogn 的快速冪解法 我們考察a 11 次方。我們將它的冪用二進位制形式表示 11轉化為二進位制是1011 也就是a 1011。我們將它再做一步轉換。二進位制 數字轉化成對應1相加的形...
hdu1061 數論 快速冪取模
對著演算法導論上寫不行,因為導論上預設b對應二進位制存入陣列中 但實際上取不出來,所以需要移位操作,會想到用向左移位,每次恰好讀的是最高位 但這樣是錯誤的,因為左移等價於乘以2,所以這個數一直在增長,直到超出資料範圍變為負值才會結束 所以應該採用右移位 對應的 如下 include using na...