PAT 1065 A+B and C(64bits)

时间:2022-09-01 11:19:51

AC版本

//书上的想法是先把相加的结果存储到res中,通过判断两数正负和res正负来判断是否溢出

//不溢出的话,再用res和c比较。
//通过flag(注意是布尔型的)来表示true 和flase,到最后一起输出,比较简便
#include<stdio.h>
int main(){
    int T,tcase=1;
    //long long a=0,b=0,c=0;
    scanf("%d",&T);
    while(T--){
        long long a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);// 这个地方一开始写成了%d,注意
        long long res=a+b;//可能溢出,但是溢出也会有结果,在long long 范围内的结果。双正相加结果为负正溢出,双负相加结果为正负溢出
        //如果一正一负相加,结果不可能溢出的
        bool flag;
        if(a>0&&b>0&&res<0){
            //说明是正溢出
            flag=true;
        }
        else if(a<0&&b<0&&res>=0){// 这个地方极其注意是>=0,但是我想不懂为什么这里要特殊注意,而上面不要。应该是最小比最大多1的问题吧
            //说明是负溢出
            flag=false;
        }
        else if(res>c)
            //正常相加后结果大于c
            flag=true;
        else
            flag=false;
        if(flag==true)
            printf("Case #%d: true\n",tcase++);
        else
            printf("Case #%d: false\n",tcase++);
    }
    return 0;
}


dec版本

//我的这个做法似乎是栈溢出,也可能不是。。为什么不能成功我不懂不懂
//没有错误,有警告,并且运行结果不是全部正确
//明确一点,在c语言中,有int——4个字节(10^9以内,-2^31~2^31,对应%d),long long——8个字节(-2^63~2^63,对应%lld)
#include<cstdio>
int main(){
    //这题其实想到先加起来和固定边界值比较一下,解决就非常easy了
    int n;
    long long a=0,b=0,c=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld%lld",&a,&b,&c);
        if(a+b>1L<<63){
            //说明必定比c大
            printf("Case #%d:true\n",i);
        }
        else if(a+b<-(1L<<63)){//是否是2^63写的不对呢?
            //说明必定比c小
            printf("Case #%d:false\n",i);
        }
        else{
            //说明 -2^63<a+b2^63,所以可以比较大小了
            if(a+b>c)
                printf("Case #%d:true\n",i);
            else
                printf("Case #%d:false\n",i);
        }
    }
    return 0;
}