码迷,mamicode.com
首页 > 其他好文 > 详细

如何判断乘法溢出

时间:2021-06-02 19:24:09      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:处理   weixin   return   负数   吐槽   sdn   如何   target   lang   

网上的很多代码都是错的,我来hack一波

https://www.cnblogs.com/klzwj1988/archive/2011/09/12/2174134.html

hack数据 10,INT32_MIN
原因:没有处理-INT32_MIN未定义的情况,大多数情况下-INT32_MIN = -INT32_MIN,直接死循环

https://blog.csdn.net/weixin_30670151/article/details/96988831

hack数据 INT32_MIN,10
原因:条件不对

常见判断有符号乘法溢出的问题

1.a * b == INT_MIN 当a取INT32_MIN,很容易出问题,正确的姿势是用除法来判断乘法溢出
2.INT32_MIN / a 当a = -1的时候,直接乘法溢出....很多代码都没有考虑到这个情况....
3.一般情况-INT32_MIN = INT32_MIN,很多人在化负数为整数的时候,没有考虑到这一点....

吐槽

网上一堆代码抄来抄去....错误的很多...吐了

hack数据

两层for暴力枚举check即可,数据很强

using ll = long long int;
vector<ll> v = {10,10,INT64_MAX,INT64_MIN,0,INT32_MAX,INT32_MIN,100,-100,INT32_MAX / 2,INT32_MIN / 2,INT64_MAX / 2,INT64_MIN / 2,3,-3,-INT64_MAX,-1,1,2,-2,-3,-10,1ll * INT32_MAX * (INT32_MAX - 10),1ll * INT32_MAX * INT32_MAX * 1ll,1ll * INT32_MIN * INT32_MAX,123456789101112ll,-1234567891234578ll-1234568,12345645,123544515555ll,1ll * INT32_MIN / INT32_MAX,1ll * INT32_MAX * 123454,1ll * INT32_MIN * 1231121,12313,INT32_MIN / 8 * 1ll - 100,1ll * INT32_MIN * 8 * 1ll + 1};

正确的代码

using ll = long long int;
ll is_mul_overflow(ll a,ll b)
  {
  	if (a == -1)
  	  return (b == INT64_MIN);
  	if (b == -1)
  	  return (a == INT64_MIN);
  	if (a >= 0 and b >= 0)
  	  return a == 0 ? 0 : INT64_MAX / a < b;
	if(a < 0 and b < 0) 
	  return INT64_MAX / a > b;
	if (b < 0)
	  return INT64_MIN / b < a;
	else
	  return INT64_MIN / a < b;
  }

如何判断乘法溢出

标签:处理   weixin   return   负数   吐槽   sdn   如何   target   lang   

原文地址:https://www.cnblogs.com/XDU-mzb/p/14833501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!