码迷,mamicode.com
首页 > 其他好文 > 详细

变治法 二进制幂

时间:2014-11-27 21:41:24      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   sp   for   on   

从左至右二进制幂算法

bubuko.com,布布扣

 

#  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。
bubuko.com,布布扣

 

变治法 二进制幂

标签:style   blog   http   io   ar   color   sp   for   on   

原文地址:http://www.cnblogs.com/220l/p/4127113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!