PAT-A 1065. A+B and C (64bit) (20)

题目链接在此

题意理解

一拿到这个题,我想到的是大数运算,不过大数运算绝对可以解决这个问题。后来看《算法笔记》知道了现在这种解法。

首先需要知道一下,这个题目A,B,C的取值范围应该是[-2^63, 2^63)左闭右开,这是经过测试发现后台数据中没有2^63这组数据。
这样一来,我们就可以直接用long long型变量来存储输入的数据。long long 型变量的取值范围是[-2^63,2^63-1]。
在《计算机组成原理》中有两个概念:正溢出负溢出

正溢出:两个整数相加的结果超过了数据类型所能表示的最大范围,结果为负数
负溢出:两个负数相加的结果超过了数据类型所能表示的最小范围,结果为正数(包括0)

有了这个结论,那么我们就可以直接根据不同的情况,来进行解题了,直接看代码即可。

AC代码

#include<stdio.h>
#include<string.h>

int main(){

    int n;
    scanf("%d",&n);

    long long a,b,c;
    long long res;
    bool flag;

    for(int i = 0; i < n; i++){
        flag = false;
        scanf("%lld %lld %lld",&a,&b,&c);
        res = a+b;
        if(a>0 && b>0){
            if(res < 0){    //正溢出 
                flag = true;
            }else{
                if(res > c){
                    flag = true;
                }
            }
        }else if(a<0 && b<0){
            if(res >= 0){   //负溢出 
                flag = false;
            }else{
                if(res > c){
                    flag = true;
                }
            } 
        }else{
            if(res > c){
                flag = true;
            }
        }

        if(flag == true){
            printf("Case #%d: true\n",i+1);
        }else{
            printf("Case #%d: false\n",i+1);
        }
    } 

    return 0;
}

注意点
1. 判断负溢出的时候需要判断res>=0,而不是>0,否则最后一个测试点过不去。
2. a+b的结果必须放到long long型变量中才能与c进行比较,不能直接用a+b>c这种形式,而应该是res = a+b; res>c这种形式,否则后两个测试点过不去。这里有人讨论过这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值