变治法 二进制幂
从左至右二进制幂算法
# 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。