首页 > 代码库 > 变治法 二进制幂
变治法 二进制幂
从左至右二进制幂算法
# 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。
变治法 二进制幂
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。