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; }