RP值

前段时间,有看到小白问一个问题,大概就是这样

while ( big.size () > sml.size () + 1 )                       //AC

while ( big.size () - sml.size () > 1 )                       //WA

如果判断写成第一种就能AC,写成第二种就WA了,为什么呢?

然后,昨晚有遇到这样一种情况,小蒙有一段代码一直WA,我改了下AC了,其中a,b,c都是int型,如下。

if(b*b<4*a*c)                                   //WA

if(b*b-4*a*c < 0)                            //AC

这个又是为什么呢?

 

对于第一个问题,恩,首先,我们谈谈sizeof的问题。

sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。

MSDN上的解释为:

The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为           typedef unsigned int size_t;

typedef unsigned int size_t;!!!!!!!!!   sizeof返回的是无符号整形!!!!

big.size () - sml.size () > 1;看出来没,左边是无符号整形,右边是有符号的整形,二者比较大小会出问题哦,亲~

如果改成big.size () > sml.size () + 1 这样呢,unsigned int和int在一起运算,int会被隐式转换成unsigned in(c专家编程第二十三页),所以sml.size () + 1这个还是unsigned int的,左右都是无符号整形,是可以比较大小的。

然后,让我们看看if(b*b<4*a*c)这个为什么不行。这个,这个,我只能说赵小蒙RP值太低了。鄙视一下下先。

b*b和4*a*c都有可能溢出,然后,if(b*b<4*a*c)这个就错了。if(b*b-4*a*c < 0)      而这个也错了,但是在某种情况下恰好巧合的对了。(看来我RP值挺高的)。

所以,应该把a,b,c定义成long或者long long就行了。毕竟,RP也有像小蒙那样的时候。

转载于:https://www.cnblogs.com/liupengfei/archive/2011/11/29/2268250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值