【算法】快速幂

快速幂是一种用来高效计算幂运算的算法,我们对于计算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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值