PAT_甲级_1065 A+B and C (64bit)

题目大意:

给出三个整数A,B,C,如果A+B>C就输出true,否则输出false;

算法思路:

注意到题目给定的数据范围,对于A,B,C都只能使用long long类型存储,其范围为[-2^63,2^63),而此题考察的是溢出问题。

对于正溢出:也就是A+B>=2^63时,由于long long最大为2^63-1,那么A+B最大为2^64-2,对2^64(long long表示的数据范围长度)取余得到-2,那么正溢出的数字在[-2^63,-2],也就是说,对于A>0,B>0,如果A+B<0就可以判定正溢出

对于负溢出:也就是A+B<-2^63时,由于long long最小值为-2^63,那么A+B最小为-2^64,对2^64(long long表示的数据范围长度)取余得到0,那么负溢出的数字在[0,2^63),也就是说,对于A<0,B<0,如果A+B>=0就可以判定负溢出。

对于没有溢出的情况,正常判断即可。

注意点:

1、必须得先进行求和然后在判断和C的大小,否则测试点1和2无法通过
2、对于负溢出,如果没有写等于0的判断条件,测试点2出错。

提交结果:

PAT_甲级_1065 A+B and C (64bit)_第1张图片

AC代码:
#include

using namespace std;

int main(){
    int T;
    scanf("%d",&T);
    long long A,B,C;
    for(int i=1;i<=T;++i){
        scanf("%lld %lld %lld",&A,&B,&C);
        long long sum = A+B;// 测试点1和2 
        if(A>0&&B>0&&sum<0){
            // 正溢出一定大于C
            printf("Case #%d: true\n",i); 
        }else if(A<0&&B<0&&sum>=0){// 测试点2考察等于0的情况 
            // 负溢出一定小于C
            printf("Case #%d: false\n",i); 
        }else{
            if(A+B>C){
                printf("Case #%d: true\n",i);
            }else{
                printf("Case #%d: false\n",i); 
            }
        }
    }
    return 0;
}

你可能感兴趣的:(算法-数据结构,c++)