[LintCode]140.快速幂

来源:互联网 发布:fragment重新加载数据 编辑:程序博客网 时间:2024/06/07 22:32

计算an % b其中a,b和n都是32位的整数。

样例

例如 231 % 3 = 2

例如 1001000 % 1000 = 0

思路:类似于实现c语言中的pow函数。double pow( double x, double y );计算x的y次幂。

首先我们要知道取模运算的乘法法则: (a * b) % p = (a % p * b % p) % p      由这个定理我们可以知道原来a^n % b

1.如果n 为奇数可以转化为 (a^(n/2) * a^(n/2) *  a ) %b = ((a^(n/2)%b * a^(n/2)%b)%b * (a)%b) %b

2. 如果n 为偶数可以转化为   (a^(n/2) * a^(n/2) ) %b = (a^(n/2)%b * a^(n/2)%b)%b

由于a^1 = a , a^0=1 ,然后递归的去求a^n ,这样我们每次就二分n,那么我们的实际的时间复杂度是O(log(n))。当n特别大的话,求幂就会变得特别快。

class Solution {public:    /*     * @param a, b, n: 32bit integers     * @return: An integer     */    int fastPower(int a, int b, int n) {        if(n==0){           return 1%b;        }        if(n==1){            return a%b;        }        long long result = fastPower(a, b, n/2);                if(n%2==1){            result = (result*result%b)*a%b;//不能直接result*result*a%b,因为不是除法            //result = (((result*result)%b) *(a%b))%b;也行        }else{            result = result*result%b;        }        return result;    }};