快速幂是一种用来高效计算幂运算的算法,我们对于计算x^n这样一个式子绝大部分人可能第一想到的是直接一个for循环,n个x相乘,暴力把它做了,但是还是太慢了,下面就来介绍另一种算法来解决这个问题。
核心就是用指数的二进制表示减少了乘法运算的次数,主要思路就是对于一个a^n,把指数n表示为一个二进制,不断判断它的最后一位是否为1,如果为1,则乘上相应的数,若为0就跳过。
在正式讲代码之前,先要带大家回忆两个运算符,可能在学了之后就没用过,早就忘记了。
“&”:按位与运算符,用于对两个整数类型的数进行按位运算,它会将两个数转换为二进制,再逐位进行比较,如果两个对应位都为1,则该位的结果为1,否则为0.
“>>”:右移运算符,这里的右移是将二进制进行右移,在二进制中进行右移相当于十进制中除以2.
具体代码如下:
public static long fastPower(long a, long n) {
long result = 1;
// 循环直到指数 n 变为 0
while (n > 0) {
// 判断 n 的二进制表示的最低位是否为 1
if ((n & 1) == 1) {
result *= a;
}
// 将 a 平方
a *= a;
// 把 n 右移一位,相当于 n 除以 2
n >>= 1;
}
return result;
}
为什么用long不用int,因为进行幂运算的结果通常很大,long的范围比int大,能有效防止溢出
在实际应用中,幂运算的结果可能会非常大,为了避免溢出,通常会对结果取模。以下是带取模操作的快速幂代码:
public static long fastPower(long a, long n, long mod) {
long result = 1;
a %= mod;
while (n > 0) {
if ((n & 1) == 1) {
result = (result * a) % mod;
}
a = (a * a) % mod;
n >>= 1;
}
return result;
}