题解代码链接¶
题目说明¶
此题是考察溢出的问题,本应该是较为容易的题。但是由于我现在是在学习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效率差不多。