快速幂的二分求法

来源:互联网 发布:沃卓斯基兄弟 知乎 编辑:程序博客网 时间:2024/05/21 12:08

long long qpow(int a, int b)

{

    long long c, d;

    c = 1;    //存a^b

    d = a;    //存a的倍幂

    while (b > 0)

    {

        if (b & 1)     //或 if (b % 2 == 1)

          c *= d;

        b = b >> 1;   //或  b = b / 2

        d = d * d;

    }

    return c;

}

 

这里,我们举个列子,比如,a^22

(22)10进制 == (10110)2进制

(a^22)

(a^16)*(a^6)

       (a^4)*(a^2)

             (a^2)*1

(10110)%2=0 c=1,d=a^2;

(1011)%2=1  c=(a^2)*1,d=a^4;

(101)%2=1   c=(a^4)*(a^2)*1,d=a^8;

(10)%2=1    c=(a^4)*(a^2)*1,d=a^16;

(1)%2=1     c=(a^16)*(a^4)*(a^2)*1;