一、思路
(一)错误做法:使用long long存储,判断溢出
1.A、B均正数,相加小于等于0,则发生了溢出即A + B >= 2^63,而C在long long表示范围内,此时一定有A + B大于C,true成立。
2.均为负数且下溢时同理一定false成立;
3.正常情况,正常判断A + B是否大于C
这种方法是可以AC的,但这种方法和测试点都存在漏洞:若给定数据在long long范围内,是完全可行的;但数据范围是:-2^ 63到2^ 63,且2^ 63是long long中无法正确解释的,被错误解释为-2^ 63。因此即使可以通过测试点,仍不是正确的做法.
例如输入:
0 9223372036854775808 1 会判断A + B < C;
9223372036854775808一定会被存储为-9223372036854775808处理,在这基础上,关于2^ 63的输入都无法做出正确判断。
因此,通过测试点的代码未必拥有正确性。
(二)正确解法
使用更大的long double类型存储,使用有更高的精度和表示范围的类型来判断。
注意:long double类型scanf()格式控制符为%llf。
二、代码
#include <cstdio>
int main()
{
int T;
scanf("%d", &T);
for( int i = 1; i <= T; ++i )
{
long double A, B, C;
scanf("%llf %llf %llf", &A, &B, &C);
printf("Case #%d: %s\n", i, A + B > C ? "true":"false");
}
}