关于程序防止数据溢出而采取1e9+7(1000000007)取模的问题

为什么要选取1000000007这个数字?

(1)首先1000000007是一个很大的质数,对质数取余能最大程度避免结果冲突/重复;

(2)其次int64位的最大值为2^63-1,用最大值对1000000007取模的结果求平方,不会在int64中溢出,long long也同理;计算加法也一样,如果先对1000000007取模结果加和,无论如何都不会超过int允许的2^31-1的值

取模需要注意的点以及如何运算?

(1)递归加和返回的情况:比如说某些求数据个数的题,返回类型为int类型,采用dfs递归结果的时候,在某一步产生了a,下一步产生了b,这两个数都是小于2^31-1=2147483647的,但是加起来就会大于2147483647,如果返回(a+b)%1000000007,显然在计算a+b的过程中已经不符合要求了,因此一般每步返回的时候是以(a%1000000007+b%1000000007)%1000000007的方式返回,这样就满足了上述第二条的情况

(2)计算乘法返回的情况:某些题要求你返回一个大数与大数积对1000000007取模后的结果,其过程和(1)类似,a×b显然大于long long了,但是如果返回[(a%1000000007)×(b%1000000007)]%1000000007就满足要求,这也是因为取模运算满足a×b%1000000007和[(a%1000000007)×(b%1000000007)]%1000000007等价

(3)注意以下情况:

a%1000000007×b%1000000007,这种显然是想计算a取模后和b取模后的积,但是取模运算符是和乘法运算同级别的,自左向右,因此b并没有取模,可能在计算过程就导致数据溢出了,还有一些比大小的题,肯定不能先取模再比大小

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值