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;
}
posted @ 2019-08-21 01:53  Doragd  阅读(152)  评论(0编辑  收藏  举报