PAT A1065 A+B and C (64bit) (20分)

看似简单但是,需要考虑溢出的情况,有正溢出和负溢出。

因为A,B,C的范围为[-263,263],而long long的取值范围为[-263,263],所以相加会存在溢出的问题 注意A+B必须存放到longlong型变量后才能与C比较,否则会造成数据计算的错误

1,当A+B>=2^63时,显然A+B>C成立,但是A+B会超过long long的最大值,发生溢出,而A、B的最大值为263-1,所以A+B的最大值为264-2,所以使用long long存储后后溢出的值的区间为[-263,-2],【-2=(264-2)%2^64】

2,当A+B<-2^63时,显然A+B<C成立,但是A+B会超过long long的最大值,发生溢出,而A、B的最小值为-263,所以A+B的最小值为-264,所以使用long long存储后溢出的值的区间为[0,263),【0=(-264)】%2^64】
注意这个零,第三个测试点卡这个地方。

#include<cstdio>
using namespace std;
int main(){
    long long A,B,C;
    int n;
    scanf("%d",&n);
    bool flag;
    for(int i = 1;i<=n;i++){
        scanf("%lld %lld %lld",&A,&B,&C);
        long long res = A+B;
        if(A>0&&B>0&&res<0) flag = true;
        else if(A<0&&B<0&&res>=0) flag = false;
        else if(res>C) flag = true;
        else flag = false;
        if(flag==true){
            printf("Case #%d: true
",i);
        }else{
            printf("Case #%d: false
",i);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/shuibeng/p/13599553.html