64位整数乘法

位运算解决64位整数乘法

假设a和b都是64位整数,要计算a*b同样可以利用位运算,首先还是考虑把b通过二进制的思想分解成几个数的和, b = n 1 + n 2 + . . . + n k b=n_{1}+n_{2}+...+n_{k} b=n1+n2+...+nk,要注意这k个数之间的关系,那么 a ∗ b a*b ab就可以写成 a ∗ n 1 + a ∗ n 2 + . . . + a ∗ n k a*n_{1}+a*n_{2}+...+a*n_{k} an1+an2+...+ank.所以还是每次判断b的最低位,看是否为1,比如第i位为1,就加 2 i 2^{i} 2i个a,怎么得到这 2 i 2^{i} 2i个a呢,其实只要在每次的循环中让a加上它本身即可。下面来看一道题。
在这里插入图片描述

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
    long long a, b, p;
    cin >> a >> b >> p;
    
    long long rel = 0;
    while(b)
    {
        if(b & 1) rel = (rel + a) % p;
        a = (a + a) % p;
        b >>= 1;
    }
    cout << rel << endl;
    
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值