pat 甲级 A1065 A+B and C (64bit) (20分)

本文探讨了在给定三个整数A、B、C的情况下,如何判断A+B是否大于C,特别是在整数范围为[-2^63,2^63]时的溢出处理。文章详细分析了不同数据类型(short、int、long、longlong)的取值范围,并提供了一段C++代码示例,展示了如何通过比较正负溢出来判断A+B>C。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805406352654336

 

 

题目大意:

给出三个整数A,B,C,要求判断是否有A+B>C。

本题需要注意点:整数A,B,C的取值范围,[-2^63, 2^63]。根据计算机组成原理的知识,理论上不难分析得出下面的结论:

short与short int可以表示的的最大范围是:-32768<---->32767  [-2^15, 2^15)

int、long int、long 可以表示的最大范围是:-2147483648<---->2147483647   [-2^31, 2^31)

long long 可以表示的最大范围是:-9223372036854775808<--->9223372036854775807    [-2^63, 2^63)

详见:

原文链接:https://blog.youkuaiyun.com/u012372584/java/article/details/77824218

 

思路分析:

根据A,B,C的取值范围,需要用长整型long long存储,同时,还需要考虑溢出,还需要分为正溢出和负溢出。

当A+B的和大于等于2^63时,此时发生正溢出,而正溢出后,值的取值范围为[-2^63, -2]。(当A+B的值达到2^63时,计算机中存储的二进制数将是ox8000000000000000,表示-2^63,当A,B取最大值均为2^63-1,因此A+B最大为2^64-2,此时计算机中存储的二进制数将是oxfffffffffffffffe,表示-2)

同上述分析,不难得出当A+B的和小于-2^63时,将发生负溢出,而负溢出后,值的取值范围为[0, 2^63)。

 

参考代码:

 

#include<cstdio>
typedef long long ll;

ll a,b,c,res;
int main(){
  int t;
  scanf("%d",&t);
  for(int i=1;i<=t;i++){
    scanf("%ld%ld%ld",&a,&b,&c);
    res=a+b;
    printf("Case #%d: ",i); 
    if(a>0&&b>0&&res<0)
       printf("true\n");
    else if(a<0&&b<0&&res>=0)
       printf("false\n");
    else if(res>c)
       printf("true\n");
    else
       printf("false\n");
  }
  return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值