2016-02-28 42 views
3

如果我有兩個整數mn,我不得不計算power(m,n)ñ,然後我寫了下面的遞歸代碼,這給時間複雜度爲O(log n)的,但我無法編寫它的迭代版本,它給出了類似的時間複雜度。如何編寫時間複雜度爲O(log n)的計算m^n的迭代版本?

int power(int m, int n) { 
    int p; 
    if (n == 1) 
     return m; 
    p = power(m, n/2); 
    if (n % 2 == 1) 
     return p * p * m; 
    else 
     return p * p; 
} 
+1

https://en.wikipedia.org/wiki/Exponentiation_by_squaring –

+0

有一些限制,防止您使用的庫函數[POW]( http://www.cplusplus.com/reference/cmath/pow/)? –

+0

不,但我想試試遞歸定義 – user123

回答

5

如果n半點是1m乘以結果。
如果n的第二個最小位是1,m*m乘以結果。
如果n的第三個最小位是1,則(m*m)*(m*m)乘以結果。

重複,該代碼應該是這樣的:

int power(int m, int n) 
{ 
    int res = 1; 
    while (n > 0) /* check all bit which is 1 */ 
    { 
     if (n % 2 == 1) res *= m; /* check current bit */ 
     m *= m; /* calculate what to multiply if next bit is 1 */ 
     n >>= 1; /* proceed to next bit */ 
    } 
    return res; 
} 
+0

請問你能解釋一下這個m = m * m的步驟嗎,我舉了一個例子(3,4),然後我計算出最終的m爲81 * 81,那麼這背後有什麼邏輯嗎? – user123

+1

3^4 =(3^2)^ 2 =((3^2)^ 2)^ 1實際上,不使用81 * 81的結果。 – MikeCAT

+0

注意:由於youi已經使用模運算符,爲什麼不劃分'n'而不是移位? – Olaf

相關問題