請發展一個非遞迴,但效率相同的程式。
答:
我們先以求m^45為例,45的二進位為101101,
所以m^45 = m^(1*2^5 + 0*2^4 +1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)
我們可以用一個tmp來記錄從最低位算到最高位的值,
先令tmp=1, 當碰到這個位數是1時,就乘上m,
每次位數檢查完以後都讓m自乘,
顯然剛好m -> m^2 -> m^4 -> m^8 ->...,
會符合每一位所代表其為m的正確的次方數。
每次檢查完以後,我們就將n的尾數丟棄(n>>=1),
記錄到最後n==0時,就離開迴圈輸出值。
Code:
#include <stdio.h> #include <stdlib.h> unsigned long iterative_power(unsigned long m, unsigned long n) { unsigned long temp = 1; while(n > 0) { if ( n & 0x01UL == 1) // last bit is 1 temp *= m; m *= m; // m -> m^2 -> m^4 -> m^8 ...... n >>= 1; // throw the last bit } return temp; } int main(int argc, char *argv[]) { unsigned long m, n; m = 4; n = 13; printf("\n%ld^%ld = %ld\n",m , n, iterative_power(m,n)); system("PAUSE"); return 0; }
沒有留言:
張貼留言