Skip to content

题解代码链接

A1065 A+B and C(64bit)

题目说明

此题是考察溢出的问题,本应该是较为容易的题。但是由于我现在是在学习c++中,干啥都用cin/cout。 发现提交这个题的时候,第三个测试点用cin过不去,用scanf就过去了。于是就想着探究一番

cin 与 scanf 探究

通过查阅资料得知,cin是有4个条件状态量的:

Text Only
1
2
3
4
goodbit:无错误
eofbit:已到达文件尾
failbit:非致命的输入/输出错误,可挽回
badbit:致命的输入/输出错误,无法挽回

而像这种输入格式不符合流设置的格式则出错,如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的溢出处理cinscanf是一样的。

测试如图 输入数据 结果

显而易见,cinscanf的差异之处

对了,对于效率这方面,cin若使用了cin.sync_with_stdio(false)关闭同步,即可跟scanf效率差不多。