题:点我
题目大意:
这题虽然看着像签到,然鹅签不过去。
因为我最初写的沙雕代码是:
#include<iostream>
#include<cstdio>
using namespace std;
int main(void)
{int t;scanf("%d", &t);for (int i = 0; i < t; i++){long long a, b, c;scanf("%lld%lld%lld", &a, &b, &c);if (a + b <= c){printf("Case #%d: false", i + 1);}else{printf("Case #%d: true", i + 1);}if(i!=t-1)printf("\n");}
}
这题的数据范围应该是用long long的,然鹅一旦发生溢出就不能简单的用加法来表示了,发生溢出的两种情况:
- 两个正数相加之后是负数,比如两个 2 31 − 1 2^{31}-1 231−1,相加之后的结果是 − 2 32 -2^{32} −232,这个负数到不了 0 0 0
- 两个负数相加之后是正数,比如 − 2 32 -2^{32} −232,相加之后结果是 0 0 0
修改后代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main(void)
{int t;scanf("%d", &t);for (int i = 0; i < t; i++){long long a, b, c;scanf("%lld%lld%lld", &a, &b, &c);long long sum=a+b;if (a > 0 && b > 0 && sum < 0){printf("Case #%d: true", i + 1);}else if (a < 0 && b < 0 && sum >= 0){printf("Case #%d: false", i + 1);}else if (a + b <= c){printf("Case #%d: false", i + 1);}else{printf("Case #%d: true", i + 1);}if(i!=t-1)printf("\n");}
}