PAT A1065 A+B and C (64bit) [硬核模拟]
题目描述
链接
判断是否A+B>C
分析
- 注意溢出问题的分析
因为A、B的大小为[-2^63, 2^63],用long long 存储A和B的值,以及他们相加的值sum:
如果A > 0, B < 0 或者 A < 0, B > 0,sum是不可能溢出的
如果A > 0, B > 0,sum可能会溢出,sum范围理应为(0, 2^64 – 2],溢出得到的结果应该是[-2^63, -2]是个负数,所以sum < 0时候说明溢出了
如果A < 0, B < 0,sum可能会溢出,同理,sum溢出后结果是大于0的,所以sum > 0 说明溢出了
代码
#include <cstdio>
using namespace std;
int main() {
int n;
scanf("%d", &n);
for(int i = 0; i < n; 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) { //a > 0 b>0 可能会溢出,结果为负数
printf("Case #%d: true\n", i + 1); //溢出得都超过longlong了,肯定就大于c了
} else if(a < 0 && b < 0 && sum >= 0){
printf("Case #%d: false\n", i + 1); //溢出得有小于longlong的最小值的,肯定就小于c了
} else if(sum > c) {
printf("Case #%d: true\n", i + 1);
} else {
printf("Case #%d: false\n", i + 1);
}
}
return 0;
}