首页 > 代码库 > 变治法 二进制幂

变治法 二进制幂

从左至右二进制幂算法

 

#  include <stdio.h>int leftRightBinaryExponentiation(int a, int b[4]);int rightLeftBinaryExponentiation(int a, int b[4]);//计算2的十三次方  1101 是13的二进制表达void main(){    int B[]={1, 1,0, 1 };         int C[]={1, 0,01, 1 };    int a=2;     printf("%d\n",    leftRightBinaryExponentiation(a,B) );     printf("%d\n",    rightLeftBinaryExponentiation(a,B) );}     /**     *      * 如 a^13 = a^(1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)     *      * @param a底数     *                 * @param b 幂二进制霍纳表达式(数组顺序幂次高到底)     *///从左至右二进制幂int leftRightBinaryExponentiation(int a, int b[4]){        int product = a;                                       int i;        // b[0]一定为1(要么为1,要么为0),因为它是最高位系数,最高位系数只能是1        for ( i = 1; i <4; i++)        {            product = product * product;             if (b[i] == 1)                product *= a;        }         return product;}     /**     *      * 如 a^13 = a^(1*2^3 + 1*2^2 + 0*2^1 + 1*2^0)     *      *  a   底数     *              *  b   幂二进制霍纳表达式(数组顺序幂次高到底)     *              * @return     */   //从右至左二进制幂    int rightLeftBinaryExponentiation(int a, int b[4])    {        int i;        int product =1;        int term = a;            for ( i =3; i >=0 ; i--)        {                        if(b[i] == 1)                product *=term;            term *= term;                   }                 return product;    }
 
从右至左算法 :term的初始值为a。第一次循环结束之后为a的平方,第二次循环结束为a的四次方。一次类推。。。。每一次循环是否乘以a看数组B是否为1,是1则乘以a。

 

变治法 二进制幂