关于程序设计中INF和MOD值的设定

在取模操作中,我们常把MOD设置为1000000007
模一个大数和模一个质数可以减少冲突
而1e9+7又有一个很好的特点,就是相加不会爆int,相乘不会爆long long

在设置无穷大值时中我们常常选择0x7fffffff作为INF值(32位int的最大值)

  1. 如果用这个值进行比较的话还好,但如果用这个数进行计算就很可能会出错。
  2. 例如在最短路径算法中用到的的松弛操作:if(a[u]+lm[u][v])
  3. 知道如果u不能到达v,那么lm[u][v]=INF,如果我们的INF取0x7fffffff,那么a[u]+lm[u][v]会溢出而变成负数, 我们的松弛操作便出错了。
  4. 我们可以得到一个设置INF值的原理:INF加上另一个数仍为无穷大

在别人的博客中看到了0x3f3f3f3f这个十分精妙的数

  1. 0x3f3f3f3f的十进制是1061109567,和0x7fffffff一样也是1e9级别的,而一般场合下的数据都是小于1e9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  2. 由于一般的数据都不会大于1e9,所以当我们把无穷大加上一个数据时,它并不会溢出
  3. 事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大,但却没有超过32位int的表示范围
  4. 0x3f3f3f3f还能给我们带来一个意想不到的额外好处:
  5. 如果我们想要将某个数组清零,我们通常会使用 memset(a,0,sizeof(a))这样的代码来实现
  6. 但是当我们想将邻接矩阵初始化时(所有边都为INF),就需要得自己写循环了
  7. 我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0
  8. 但是如果我们将无穷大设为0x3f3f3f3f,由于0x3f3f3f3f的每个字节都是0x3f
  9. 所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))



转载于:https://www.cnblogs.com/gfvod/p/5548313.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值