数据结构-二分法求幂-C

2020-10-09  本文已影响0人  dadalang

二分法求幂

数据结构中二分法运用到求幂提高计算效率方式,算法精简这里做个简单解释及代码

原理自析

如求2^32: 代表底数跟指数,最终结果result

1.判断底数是否为0 为0 则直接输出0;

2.底数不为0时,判断指数是否为0,为0则输出1;

3.底数指数均不为0时,result=1,,进行运算:

A.指数与2求余的结果,如果为1则将result*底数;并且底数(新)= 底数(旧)*底数(旧)

B.指数与2求模的结果,作为新的指数,

3.最终当指数与2就模为0时,输出最终结果result

result只是将指数为1的数据进行最终乘法计算,(黑色字体为result相乘的数据)

2^6  =(2*2)^3

        =(2*2)^1 *(2*2)^2

        =(4)^1 *(4)^2

        =(4)^1 *(4*4)^1

        =(4)^1 *(16)^1

        =64

#include <iostream>

using namespace std;

int a, b;  //利用二分法快速求a^b

int main(int argc, char *argv[]) {

cin >> a >> b;

while (true)

{

int result = 1;

if (a == 0)

cout << 1 << endl;

else if (b == 0)

cout << 1 << endl;

else

{

while (b != 0)

{

if (b % 2 == 1)

{

result *= a;

}

a *= a;

b /= 2;

}

}

cout << "结果:" << result << endl;

cin >> a >> b;

}

return 0;

备注:以上二分法基本思路完成,通过参考资料给指数求余和求模,其实可以通过位运算进一步提高计算性能

b % 2等价于 b & 1,因为B为偶数时,其二进制最后一位一定是0,B为奇数时,其二进制最后一位一定是1;因此做与计算为0则为偶数,计算为1则为奇数

b / 2 等价于 b >> 1 ,因为B/2相当于将B的二进制每一位向后移动1位;

参考进阶资料公式 用于获取最终结果后三位

(a + b) % p = (a % p + b % p) % p (1)

(a - b) % p = (a % p - b % p ) % p (2)

(a * b) % p = (a % p * b % p) % p (3)

while(b>0) {

if(b&1) {//此处等价于if(b%2==1)

result = result * a%1000;}

b>>=1;//此处等价于b=b/2

a= (a* a) %1000;

 }

return result;

上一篇 下一篇

猜你喜欢

热点阅读