快速幂(Quick power,以下简称qpw)是math.h
或cmath
里的内置函数pow
的升级版(只不过是比pow
快了一些)
qpw函数需要实现以下的条件:
- 声明ans变量,赋值为1
- 如果指数为奇数,ans乘上原数
- 原数=原数的平方,指数除以2
- 如果b==0,返回ans,否则重复执行2,3步
- 注意取值范围以及是否需要求模
先写出代码:
long long qpw(long long x, long long y) {
long long ans = 1;
while (y != 0) {
if (y % 2 == 1) ans *= x;
x *= x, y /= 2;
}
return ans;
}
在main函数里调用qpm(2, 10)
,结果为1024,说明没有错误
稍加优化:
long long qpw(long long x, long long y) {
long long ans = 1;
while (y) {
if (y & 1) ans *= x;
// y&1为1,就是奇数,否则是偶数
x *= x, y >>= 1;
// n >>= 1等价于n/2,但只适用于整数
// y&1和y>>=1使用了位运算,更省时间
}
return ans;
}
针对需要求模的情况:
// x为原数,y为指数,m为用来模的数
int qpw(long long x, long long y, int m) {
int ans = 1;
while (y) {
if (y & 1) ans = 1LL * ans * x % m;
x = x * x % m, y >>= 1;
}
return ans;
}
在程序中调用qpw(2, 10, 500)
,得到24,说明正确