关于算法-数据结构:PAT甲级1065-AB-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出错。

提交后果:

AC代码:
#include<cstdio>

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;
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理