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

题目链接:

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.csdn.net/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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值