昨天剛剛學了快速冪運算來加快冪運算,即ax,來總結一下
我們最常用的冪運算是,使用乙個迴圈語句來控制迴圈乘或者直接使用庫函式pow(int a,int n)來實現冪運算。
使用迴圈語句來進行冪運算,時間複雜度是o(n)
再進行網上查詢了解到pow庫函式的時間複雜度會比o(n)還大
了解鏈結為
所以我們使用一種新的演算法來解決超時問題
快速冪運算
快速冪運算實際上是用了二分的思想,不過二分法還沒自學到那,就直接和你們說原理了
比如a56 ,我們如果不乙個乙個a相乘的話,怎麼解決算才會減少時間呢,在我們實際運算乙個冪運算的時候,給你乙個28,你是不是會進行24 *24來算2的8次方
不會吧不會吧真的還有人乙個乙個乘來算出2的8次方叭!
重新回到正題,a56 = (a28)2 = ((a14)2)2= ((a7)2)2)2 ,到奇數的時候怎麼辦? a7 = a(3+3+1)=(a3)2 * a,直到化到a,這樣算下來時間複雜度就是o(logn),明顯大大縮短了時間。
接下來敲一下**
quick pow簡稱qp
int qp(int a,int n)
這就是快速冪的**,就這麼短就縮短了大部分時間
接下來說一下**細節
這裡是運用了二進位制轉換來達到**簡便。
比如10的二進位制為1010,計算210的時候可以如下計算
我們知道2
10 =2 (20*0+21*1+22*0+23*1)
所以計算an的時候也一樣
化為二進位制的好處在於
可讓a=a * a一直執行,當取到n的二進位制不為0的時候就進行乘進去。
n&1的意思是 n的二進位制和1進行 位與預算
插入乙個位與預算的知識,比如10和1位與運算,10的二進位制為1010,1的二進位制就是1,位與運算的規則是,每個位置上一一對應,若同為1,則為1,如以下:
1010
0001
——0000
乙個整數和1進行位與運算,即是取這個整數二進位制的最後一位數,再配合右移運算子》便可取完整個整數的二進位制每個位數。
最後當n>>1 =0的時候結束迴圈,即可求得an.
二進位制運算
運算子 符號含義例子與 兩邊都為真時為真 1 1 1或 任何一邊為真時為真1 非取反 如果1則為0 如果0為1 1 0 異或 兩邊相同為1 兩邊不同為0 1 1返回false 1 2返回true 運算子符號含義 例子邏輯與 判斷兩邊 都為真時為真 true true true或 判斷兩邊 任何一邊為...
二進位制運算( )
負數轉化二進位制步驟 將負數取絕對值,得到其絕對值的二進位制 6取絕對值為6,6的二進位制 0110,然後補充0110位32位 000 000 0110 一共32位,即0110前面還有28個0 然後每位取反 111 111 1001 一共32位 接著對上面得到的二進位制 111 111 1001 進...
二進位制運算
一 運算子 按位與 按位或 按位異或 按位取反 按位左移 有符號的按位右移 無符號的按位右移 二 算術運算 二進位制數的算術運算包括 加 減 乘 除四則運算,下面分別予以介紹。1 二進位制數的加法 根據 逢二進一 規則,二進位制數加法的法則為 0 0 00 1 1 0 1 1 1 0 進製為1 1 ...