题目
Given three integers A, B and C in [ − 2 63 , 2 63 ] [-2^{63},2^{63}] [−263,263], you are supposed to tell whether A + B > C A+B\gt C A+B>C.
Input Specification:
The first line of the input gives the positive number of test cases, T ( ≤ 10 ) T(\le10) T(≤10). Then T test cases follow, each consists of a single line containing three integers A A A, B B B and C C C, separated by single spaces.
Output Specification:
For each test case, output in one line Case #X
: true if
A
+
B
>
C
A+B>C
A+B>C, or KaTeX parse error: Expected 'EOF', got '#' at position 6: Case #̲X: false otherwise, where X
is the case number (starting from 1).
Sample Input:
3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0
Sample Output:
Case #1: false
Case #2: true
Case #3: false
题目大意
判断 A + B A+B A+B与 C C C的大小。
思路
题目给的数据范围刚好是long long
,所以
A
+
B
A+B
A+B可能会溢出,第一眼看到题目,以为是大整数相加的问题,还是做题太少了,有点蠢,哈哈;
其实这道题考的是溢出的问题,
- 当
A
+
B
≥
2
63
A+B\ge2^{63}
A+B≥263时,显然
A
+
B
>
C
A+B>C
A+B>C成立,但是
A
+
B
A+B
A+B会超过
long long
的最大值,发生溢出,而 A A A、 B B B的最大值为 2 63 − 1 2^{63}-1 263−1,所以 A + B A+B A+B的最大值为 2 64 − 2 2^{64}-2 264−2,所以使用long long
存储后后溢出的值的区间为 [ − 2 63 , − 2 ] [-2^{63},-2] [−263,−2]; - 当
A
+
B
<
−
2
63
A+B\lt-2^{63}
A+B<−263时,显然
A
+
B
<
C
A+B\lt C
A+B<C成立,但是
A
+
B
A+B
A+B会超过
long long
的最大值,发生溢出,而 A A A、 B B B的最小值为 − 2 63 -2^{63} −263,所以 A + B A+B A+B的最小值为 − 2 64 -2^{64} −264,所以使用long long
存储后溢出的值的区间为 [ 0 , 2 63 ) [0,2^{63}) [0,263);
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main(){
int n;
scanf("%d", &n);
for(int t=1; t<=n; t++){
long long a, b, c, sum;
scanf("%lld%lld%lld", &a, &b, &c);
printf("Case #%d: ", t);
sum = a + b;
if(a > 0 && b > 0 && sum < 0)
printf("true\n");
else if(a < 0 && b < 0 && sum >= 0)
printf("false\n");
else if (sum > c)
printf("true\n");
else
printf("false\n");
}
return 0;
}