if求解释

l369294289 2011-11-24 10:28:25
if(b*b-4*a*c > 0) 和 if(b*b > 4*a*c)有什么不同,为什么在oj上写成前一种能过,写成后一种就WA了?
...全文
217 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 pengzhixi 的回复:]

引用 19 楼 l369294289 的回复:
引用 18 楼 pengzhixi 的回复:

前面一个可能会超出Int的表示范围,比如4*a*c是一个绝对值很大的负数,b*b也是一个很大的正数,那么b*b-4*a*c那么就可能非常的的正数超出int的表示范围。

呵呵~好吧~我发现我真的好笨额~


额,这个属于一些细节东西,不是笨不笨的问题,一般很少会注意到而已。
[/Quote]
其实,做OJ上的题,特别是简单题,一般都要考虑到有卡数据的情况,这么明显我却没想到,确实是我二了。
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 pengzhixi 的回复:]

当上溢的时候那么可能就会得到一个负数,那么b*b-4*a*c>0就得到相反的结论。
[/Quote]
恩恩,以后有什么问题还请大侠多多指教~
pengzhixi 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 l369294289 的回复:]
引用 18 楼 pengzhixi 的回复:

前面一个可能会超出Int的表示范围,比如4*a*c是一个绝对值很大的负数,b*b也是一个很大的正数,那么b*b-4*a*c那么就可能非常的的正数超出int的表示范围。

呵呵~好吧~我发现我真的好笨额~
[/Quote]

额,这个属于一些细节东西,不是笨不笨的问题,一般很少会注意到而已。
pengzhixi 2011-11-25
  • 打赏
  • 举报
回复
当上溢的时候那么可能就会得到一个负数,那么b*b-4*a*c>0就得到相反的结论。
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 pengzhixi 的回复:]

前面一个可能会超出Int的表示范围,比如4*a*c是一个绝对值很大的负数,b*b也是一个很大的正数,那么b*b-4*a*c那么就可能非常的的正数超出int的表示范围。
[/Quote]
呵呵~好吧~我发现我真的好笨额~
pengzhixi 2011-11-25
  • 打赏
  • 举报
回复
前面一个可能会超出Int的表示范围,比如4*a*c是一个绝对值很大的负数,b*b也是一个很大的正数,那么b*b-4*a*c那么就可能非常的的正数超出int的表示范围。
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pengzhixi 的回复:]

你这不就是因为这个可能性引起的。size()返回的应该就是unsigned int 两者相减的话,即使小的减大的 就会出现问题,比如2-4结果肯定是大于1的。
[/Quote]
恩恩~发现了额~我书都白看了~谢谢~
但是这一个if(b*b-4*a*c > 0) 和 if(b*b > 4*a*c)有什么不同?a,b,c都是我定义的int型。
pengzhixi 2011-11-25
  • 打赏
  • 举报
回复
你这不就是因为这个可能性引起的。size()返回的应该就是unsigned int 两者相减的话,即使小的减大的 就会出现问题,比如2-4结果肯定是大于1的。
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anyidan 的回复:]

引用 6 楼 pengzhixi 的回复:
因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0


应该是 前一种不能过,写成后一种就能过了

前一种可能溢出
[/Quote]
我之前也觉得while ( big.size () > sml.size () + 1 )这种会溢出,但是这种可以AC,改成后面一种就会WA
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 keiy 的回复:]

如果都是int的话,看不出有什么区别
从汇编角度,前者只是多用了个减法运算
[/Quote]
呵呵~我们都这么认为~学长称这是人品题。哈哈~
l369294289 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]

因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0
[/Quote]
这个我知道,可是不是因为这个引起的。我也不知道为什么。求大侠解释
http://www.miyub.com/2011/11/11/a-b-1-%e4%b8%8e-a-b-1-uva-10107-what-is-the-median.htm
lancerEx 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anyidan 的回复:]

引用 6 楼 pengzhixi 的回复:
因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0


应该是 前一种不能过,写成后一种就能过了

前一种可能溢出
[/Quote]

我也觉得应该是这样,LZ是不是写错了
刀刀亮 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 keiy 的回复:]

如果都是int的话,看不出有什么区别
从汇编角度,前者只是多用了个减法运算
[/Quote]
牛人思考层面就是不一样
w28050 2011-11-25
  • 打赏
  • 举报
回复
好吧,说实话,这题我不会,不解释。
槑党--一缕风 2011-11-25
  • 打赏
  • 举报
回复
说实话,这题我不会,不解释。
子牙河畔 2011-11-25
  • 打赏
  • 举报
回复
区别不大,主要是你使用的软件的问题,你用别的软件试试就知道了。
AnYidan 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0
[/Quote]

应该是 前一种能过,写成后一种就能过

前一种可能溢出
柯本 2011-11-24
  • 打赏
  • 举报
回复
如果都是int的话,看不出有什么区别
从汇编角度,前者只是多用了个减法运算

  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0
[/Quote]
++
pengzhixi 2011-11-24
  • 打赏
  • 举报
回复
因为如果两个unsigned相减或者 一个Int,一个unsigned相减得到的结果永远大于0
加载更多回复(5)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧