【蓝桥杯Java组】一学就会的小技巧(四):龟速乘

header

🍋前言:

🌵🌵上一篇文章中我们已经学会了快速幂这个技巧,从快速幂中还可以拓展出龟速乘;龟速乘用来在计算 ( a × b ) m o d    p (a \times{b}) \mod p (a×b)modp时,防止计算途中因数据过大导致爆long long


🍉龟速乘:

👩🏻‍🏫龟速乘这个技巧和它的名字一样,时间复杂度为 O ( l o g N ) O(logN) O(logN)。明明能直接算乘法,还要来个龟速~不过慢工出细活,结合上篇提到的同余定理,可以解决两数直接相乘再取模可能导致的数据溢出。

🚕以 3 × 10 m o d    4 3 \times{10} \mod{4} 3×10mod4为例,看看如何进行龟速乘:

🚕和快速幂类似,将 3 × 10 3 \times 10 3×10的其中一个因子写成二进制形式 3 × ( 1010 ) 2 3 \times{(1010)_2} 3×(1010)2,那么可以得到:

3 × 10 = ( 3 × 1 ) × 0 + ( 3 × 2 ) × 1 + ( 3 × 4 ) × 0 + ( 3 × 8 ) × 1 3 \times 10 = (3 \times{1}) \times 0 + (3 \times{2}) \times 1 + (3 \times{4}) \times 0 + (3 \times{8}) \times 1 3×10=(3×1)×0+(3×2)×1+(3×4)×0+(3×8)×1

即 : 3 × 10 = 3 × 2 + 3 × 8 即:3 \times 10 = 3 \times 2 + 3 \times8 3×10=3×2+3×8

🚕发现同样可以利用二进制的运算特点,那么我们只需要将快速幂的乘法换成加法即可~

🚕取模运算由同余定理,同样也和快速幂一样,可以将模运算加入到每一次计算中,其实就是快速幂的模板改了个运算符号😎

🍦模板代码(Java):

public class Main {

    public static long fastMultiply(long a, long b, long p) {
        long res = 0;
        while (b > 0) {
            if ((b & 1) == 1)
                res = (res + a) % p;
            a = (a + a) % p;
            b = b >> 1;
        }
        return res;
    }

    public static void main(String[] args) {
          System.out.println(fastMultiply(5211251314L, 1251314125, 2022331));
    }
}
  • 结果:731399,用计算器试一下计算结果正确(~ ̄▽ ̄)~

🍌🍌🍌
本文介绍了第四个小技巧——龟速乘,用来防止计算乘法时爆long long,方法与快速幂类似,可见快速幂的重要性~
🍍🍍🍍
创作不易,如果觉得本文对你有所帮助的话请动动小手,给博主点个免费的赞吧。🙇🏻‍♀️
🍉🍉🍉
@作者:Mymel_晗,计科专业大学牲一枚,请大佬们多多关照~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mymel_晗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值