lintcode刷题之快速幂。
原题如下:
计算an % b,其中a,b和n都是32位的整数。
例如 231 % 3 = 2
例如 1001000 % 1000 = 0
1、直接算出幂再取余肯定是不可取的,因为数值太大,会溢出;
2、使用取模运算乘法法则:a^n%b=(a^(n/2)%b)*(a^(n/2)%b)%b,即使用递归的方法来求解;
3、要注意当n为奇数的时候,需要单独考虑,列如计算2^3%3时,n的值为3,除以2之后为1,2^3%3=(2%3)*(2%3)%3结果还需要再乘上一次(2%3),即结果是
2^3%3=(2%3)*(2%3)*(2%3)%3,即奇数次幂的时候在结果后还要乘上一次(a%b)然后再%b.
具体的C++代码如下:
class Solution {
public:
/*
* @param a, b, n: 32bit integers
* @return: An integer
*/
int fastPower(int a, int b, int n) {
// write your code here
if(n==0)
{
return 1%b;
}
if(n==1)
{
return a%b;
}
if(n<0)
{
return -1;
}
long res=fastPower(a,b,n/2);
res=(res*res)%b;
if(n%2==1)
{
res=(res*(a%b))%b;
}
return res;
}
};