快速幂顺带取余

正常求幂

PS:先不考虑异常输入, int溢出

int normalPow(int x, int n){
    int res = 1;
    while(n){
        res *= x;
        n --;
    }
    return res;
}

问题: n值小的时候计算量可以接受,一旦大了,计算量非常大,于是要将这个O(n)的算法优化。怎么优化?O(1)肯定不可能,所以往O(log(n))的方向考虑

快速幂

  • 求 2^10. 循环10次每次2,等等,每次2,换成每次*4(22)行不行?这样循环5次就完事了(10/2=5)。每次*8(23)行不行?可以,不过一个数除3余数的情况为0、1、2
  • 由上一条可得:
long fastPow(long x, int power){
        long res = 1;
	while(power){
     	if(power&1) res = res * x;//如果奇数

     	x = x * x;//x-->x^2
     	power >>= 1;//除2,无论奇偶除2都一样,power是整数
	}
	return res;
}

快速幂带求余

long  fastPowerMod (int x, int power, int modn) 
{  
    long res= 1; 
    x = x % modn; //若 x<modn 则 x%modn 为其自身
    while (power) {  
        if(power&1) 
            res= (res* x) % modn; 

        x = (x * x) % modn; 
        power >>= 1;//除2,无论奇偶除2都一样,power是整数
    } 
    return res; 
} 
posted @ 2020-10-12 18:19  miyanyan  阅读(56)  评论(0编辑  收藏  举报