快速幂

以前的话快速幂对我来说是个难题,写都写不出来,现在我理解快速幂算法的原理,知道算法的步骤,所以写起来就简单多了,

当你练习的多的时候,自然就会的多了,原来的难题对你来说也会变得不算什么,所以,加油,多练习,做一题,会一类题;

举个例子算3^10,变成3^(2^0*0 + 2^1*1 + 2^2*0 + 2^3*1), 也就是3^(2^1 + 2^3), 即3^2  *  3 ^8;

即10变成二进制后就是1010,

令ans = 1, pow = 3;

第一次n = 1010(2),   1010(2)&1 = 0;  所以ans不变,即ans = 1        然后pow *= pow, 即pow = 9, n /= 2, 即n = 101(2);

第二次n = 101(2),     101(2)&1 = 1;    所以ans *= pow;即ans = 9,       然后pow *= pow, 即pow = 81, n/= 2,即n = 10(2);

第三次n = 10(2),       10(2) &1 = 0;     ans不变, ans = 9,              然后pow *= pow, 即pow = 81*81, n/=2, 即n = 1;

第四次n = 1(2),         1(2)&1 = 1,    ans*= pow, 即ans = 9 * 81*81,pow *= pow,   即pow = 81^4,   n/= 2, 即n = 0;

n = 0, 所以算法结束;

#include <stdio.h>
__int64 Qfact(int x, int n)
{
    __int64 ret = 1, pow = x;
    while(n)
    {
        if(n&1)
            ret *= pow;
        pow *= pow;
        n /= 2;
    }
    return ret;
}
int main()
{
    int x, n;
    while(~scanf("%d%d", &x, &n))
    {
        printf("%I64d
", Qfact(x, n));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/rain-1/p/4761766.html