快速幂算法(全网最详细地带你从零开始一步一步优化)_刘扬俊的博客-CSDN博客_快速幂算法
C++ 快速幂运算_迷亭1213的博客-CSDN博客_c++快速幂(快速幂算法+高精度)洛谷P1045 麦森数_TreeTraveler的博客-CSDN博客C++ 快速幂运算_迷亭1213的博客-CSDN博客_c++快速幂
取模运算的运算法则:
(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)
1. 直接求——求2^100
#include <iostream>
#include <cmath>
using namespace std;
/**
* 普通的求幂函数
* @param base 底数
* @param power 指数
* @return 求幂结果的最后3位数表示的整数
*/
long long normalPower(long long base, long long power) {
long long result = 1;
for (int i = 1; i <= power; i++) {
result = result * base;
result = result % 1000;
}
return result % 1000;
}
int main() {
long long base, power;
while (true) {
cin >> base >> power;
if (base == 0 && power == 0) break;
cout << normalPower(base, power) << endl;
}
return 0;
}
2. 快速幂
每一步都把指数分成两半,而相应的底数做平方运算。
3^10 = 3*3*3*3*3*3*3*3*3*3= (3*3)^5 = 9^5 = (9^4)*(9^1) = (81^2)*(9^1)
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power % 2 == 0) {
//如果指数为偶数
power = power / 2;//把指数缩小为一半
base = base * base % 1000;//底数变大成原来的平方
} else {
//如果指数为奇数
power = power - 1;//把指数减去1,使其变成一个偶数
result = result * base % 1000;//此时记得要把指数为奇数时分离出来的底数的一次方收集好
power = power / 2;//此时指数为偶数,可以继续执行操作
base = base * base % 1000;
}
}
return result;
}
语句优化:
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power % 2 == 1) {
result = result * base % 1000;
}
power = power / 2;
base = (base * base) % 1000;
}
return result;
}
3. 优化
位运算来替代一些语句。
power%2==1 —————— power&1
power=power/2 —————— power >>= 1;
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {//此处等价于if(power%2==1)
result = result * base % 1000;
}
power >>= 1;//此处等价于power=power/2
base = (base * base) % 1000;
}
return result;
}