3 ^ 999 = 3 * 3 * 3 * … * 3 算法
直接乘要作998次乘法。但事實上能夠這樣作: 函數
3 ^ 2 = 3 * 3 ui
3 ^ 4 = (3 ^ 2) * (3 ^ 2) spa
…………code
3 ^ 256 = (3 ^ 128) * (3 ^ 128) 遞歸
3 ^ 512 = (3 ^ 256) * (3 ^ 256) class
再相乘: while
3 ^ 999 co
= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1) 位運算
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
這樣只要作16次乘法。
把999轉爲2進制數:1111100111,其各位就是要乘的數。
1 1 1 1 1 0 0 1 1 1
9 8 7 6 5 4 3 2 1 0
對應的位置號是k就是3^(2^k)
1.遞歸解 利用模運算規則,採用遞歸方式,計算X^N(% P) 函數名:PowerMod 輸入值:unsigned int x,底數x unsigned int n,指數n unsigned int p,模p 返回值:unsigned int,X^N(% P)的結果 */ unsigned int PowerMod(unsigned int x, unsigned int n, unsigned int p) { if (n == 0){ return 1; } unsigned int temp = PowerMod((x * x)%p, n/2, p); //遞歸計算(X*X)^[N/2] if ((n & 1) != 0) //判斷n的奇偶性 { temp = (temp * x) % p; } return temp; } 2 非遞歸解 long long quickpow(long long m , long long n , long long k){ long long ans = 1; while(n){ if(n&1)//若是n是奇數 ans = (ans * m ) % k; n = n >> 1;//位運算「右移1相似除2」 m = (m * m) % k; } return ans; }