前段时间,有看到小白问一个问题,大概就是这样
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也有像小蒙那样的时候。