题:点我
题目大意:
这题虽然看着像签到,然鹅签不过去。
因为我最初写的沙雕代码是:
#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");
}
}