引入:
假如有一道题目让我们编写程序求3的100次幂的最后四位数,我们会不会觉得很简单,只是一个简单的循环就可以搞定
#include <stdio.h>
int main() {
long long sum = 1;
for (int i = 1; i <= 20; i++) {
sum *= 3;
sum %= 10000;
}
printf("%lld", sum);
}
那如果我们要求3的1000000次方呢,还是用循环吗,那么这个过程一定会花费大量的时间
而我们今天讲的快速幂可以大大缩短所用时间
快速幂:
如果我们要求5的10次方,我们可以将其转化为求25的5次方,25乘上625的平方最后转化为390625(625的平方)乘上25;这样本来需要十次循环的过程变成了仅仅需要3次转换的过程
快速幂代码:
#include <iostream>
using namespace std;
long long kuaisumi(int di, int zhi) {
long long sum = 1;
while (zhi!= 0) {
if (zhi % 2 == 1) {
sum *= di % 1000000000; //这里作者怕爆longlong仅取最后九位了嗷
}
zhi /= 2;
di = (di * di)%1000000000;
}
return sum;
}
int main() {
int di, zhi; //di是底数,zhi是指数
cin >> di >> zhi;
cout << (long long)kuaisumi(di, zhi);
}
快速幂(位运算)代码:
位运算的代码用时更少
#include <iostream>
using namespace std;
long long kuaisumi(int di, int zhi) {
long long sum = 1;
while (zhi!= 0) {
if (zhi & 1) { //这里是zhi%2==1的意思
sum *= di % 1000000000;
}
zhi >>= 1; //这里是zhi/=2的意思,即向右移动一位在二进制中即除以2
di = (di * di)%1000000000;
}
return sum;
}
int main() {
int di, zhi; //di是底数,zhi是指数
cin >> di >> zhi;
cout << (long long)kuaisumi(di, zhi);
}