大数相乘取模,防止乘法溢出 C++

原理同快速幂

2 * 7 = 2 + 2 * 6

         = 2 + 4 * 3

         = 2 + 4 + 4 * 2

         = 2 + 4 + 8 * 1

#define int long long
int p;
int qmul(int a, int b){
    int res = 0;
    while(b){
        if( b & 1){
            res = (res + a) % p;
        }
        a = a * 2 % p;
        b >>= 1;
    }
    return res;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在计算机中,我们通常使用二进制补码来表示带符号的整数。当计算 A 减 B 时,我们可以将其转化为 A 加上 B 的补码,即 A + (-B)。由于计算机中的整数通常都是有限的,如果 A + (-B) 的结果超出了整数的表示范围,那么我们需要将其对模取余,以使结果在表示范围内,并且保持正确的符号。因此,在计算 A 减 B 的补码时,需要取模以确保结果在合法的范围内。 ### 回答2: 在计算机中,补码是一种用于表示负数的编码方式。对于一个给定的有限位数,补码能够非常有效地进行数值运算,包括加法、减法、乘法和除法等。A减B的补码为什么要取模,与补码的特性有关。 补码的表示方式是使用最高位作为符号位,0表示正数,1表示负数。其中,正数的补码就是它本身,而负数的补码则是其绝对值的反码加1。这样,用补码表示的数在加减法运算中,可以简化为二进制的加法运算,而无需分别计算正负数的情况。 A减B的补码取模主要是为了保持结果的有效位数不超过原定位数。在进行减法运算时,可能会出现溢出的情况,即结果的位数超过了所规定的位数。这时,只取溢出部分的低位作为结果,就能保持结果的位数不超过原定位数。 补码取模对于计算机中的数值运算非常重要。通过对结果进行模取操作,可以防止结果位数的溢出,并且保持计算的精度。补码取模的操作是这样的:首先,将运算的结果与2^n进行按位与运算(n为结果的位数),得到结果的低n位;然后,根据结果的最高位(符号位)是否为1,来决定结果的正负。 总之,A减B的补码取模是为了确保结果的位数不超过所规定的位数,并保持计算的精度。这一步骤对于计算机中的数值运算非常重要,能够有效地处理正负数的减法运算。 ### 回答3: 在计算机中,补码是一种用来表示有符号数的编码方式。对于一个带符号数A减去另一个带符号数B,我们首先需要将A的补码和B的补码相加。由于补码表示的范围是有限的,所以在计算中可能会出现溢出的情况。 当发生溢出时,我们需要将结果取模,以确保结果仍能在补码表示的范围内。具体来说,如果A的补码和-B的补码相加产生了溢出,那么我们需要将结果模上像2^n这样的数(n是补码表示的位数),以使结果重新回到合法的补码范围内。 例如,假设我们用8位补码表示有符号数,A的补码是01011010,B的补码是00110101。我们将A的补码和-B的补码相加,得到的结果是10001111,这个结果是一个负数的补码。由于8位补码可以表示-128到127之间的数,超出这个范围的结果将发生溢出。 为了修正溢出的结果,我们需要将结果模上28(即256),以保证结果仍在8位补码范围内。对于上述例子,我们可以将结果10001111模上256,得到的最终结果是15,即00001111的补码表示。 因此,A减B的补码之所以要取模,是为了保证结果仍能在补码表示的范围内,避免发生溢出的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值