题解代码链接¶
题目说明¶
此题是考察溢出的问题,本应该是较为容易的题。但是由于我现在是在学习c++中,干啥都用cin
/cout
。
发现提交这个题的时候,第三个测试点用cin
过不去,用scanf
就过去了。于是就想着探究一番
cin 与 scanf 探究¶
通过查阅资料得知,cin
是有4个条件状态量的:
Text Only | |
---|---|
1 2 3 4 |
|
而像这种输入格式不符合流设置的格式则出错,如cin
一个int
数据,但是其值为\(2^{31}\)=2147483648,产生上溢。
-
cin
的处理此时
failbit
将被设置为1,表示出错,且此时cin
输入的数据以全1表示出错,此处即为\(2^{31}-1\)=2147483647。 -scanf
的处理此时输入的值为\(-2^{31}\),即-2147483648
cin
返回false则出错,可以检测出这种failbit出错,即用cin.fail()
。若failbit
被设置了,则返回true
。捕获到错误后,则可以通过cin.clear()
清除状态标志位,即可以挽回。此时可继续输入新的值存入刚才要存入的变量中,之前的错误输入则被丢弃(这一点我其实有在查找能否不丢弃,重新利用,但没有找到这方面但资料🙃)
若不清除状态标志位,则后续不能继续进行输入
还有一个问题是,使用int
是可以测出这个差别的,但此题是用long long
型的,或许是因为目前机器(包括oj)基本都是64位的,所以在这里对long long
的溢出处理cin
和scanf
是一样的。
测试如图
显而易见,cin
与scanf
的差异之处
对了,对于效率这方面,cin
若使用了cin.sync_with_stdio(false)
关闭同步,即可跟scanf
效率差不多。