变治法 二进制幂

从左至右二进制幂算法

 

#  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。

 

posted @ 2014-11-27 20:26  聪明娄娄  阅读(911)  评论(0编辑  收藏  举报