以求2的100000000次方的后三位为例:
//第一种效率低下的算法, time cost = 16.91s typedef long long ll; const int mod = 1000; ll normalPower(ll base, ll power){ ll result = 1; for(int i=1; i<=power; i++){ result = result * base; result = result % mod; } return result % mod; }
//升级版,time cost = 0.003s ll fastPower(ll base, ll power){ ll result = 1; while(power > 0){ if(power%2 == 0){ //指数减半,基数加倍 power = power/2; base = base * base % mod; }else{ //指数减一,求模运算一次 power = power - 1; result = result * base % mod; //再次执行一次降指数操作 power = power / 2; base = base * base % mod; } } return result; }
//代码优化版 time cost <= 0.003s ll fasterPower(ll base, ll power){ ll result = 1; while(power > 0){ if(power%2 == 1){ //为奇数,执行一次操作 result = result * base % mod; } //power/2会化奇为偶 power = power/2; base = (base * base) % mod; } return result; }
//极限优化,使用位运算 time cost = 0.001s ll fastestPower(ll base, ll power){ ll result = 1; while(power > 0){ if(power & 1){ //为奇数,执行一次操作 result = result * base % mod; } //power/2会化奇为偶 power >>= 1; base = (base * base) % mod; } return result; }