快速幂与快速模幂

快速幂

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; 

 }
相关文章
相关标签/搜索