0%

PAT A1065 A+B and C (64bit)

题目链接

解题思路:这道题目涉及到计算机组成原理的知识,有必要在回顾一下。首先题目给出的范围是long long的范围[$-2^{63},2^{63}-1$],因此题目中给出的两个整数相加可能会溢出(正溢出或负溢出)。在计算机组成原理中指出,如果两个正数之和等于负数为正溢出,两个负数之和等于正数为负溢出。基于此题目,需要明确溢出后的具体范围,才能准确判断!

在确定正负溢出范围之前需要先明确一下long long范围是怎么来的,计算机中long long类型占64位,第一位是符号位,所以共有63位表示数据,取最大值的时候63位应该都存1,所以是$2^{63}-1$,可以类比十进制,很容易得出。

正溢出范围:当$A+B>=2^{63}$时,显然有$A+B>C$成立,因为C也是个long long 范围的整数,但A+B会因为超过long long 的正向最大值$2^{63}-1$而发生正溢出。在计算机中long long溢出可以参考下图来确定溢出范围。因为一共有64位,所以可以理解成循环表示,正数和0占63位,负数占63。经过下图理解,可知当A和B都为正数,但是和却为负数时,就一定是正溢出,结果为true。

image-20200821184402504

负溢出范围:当$A+B<-2^{63}$时,显然有$A+B但是和却$>=0$时,</font>就一定是负溢出,结果为false。

image-20200821185203238

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
typedef long long ll;
ll a,b,c,sum;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld %lld %lld",&a,&b,&c);
sum=a+b;
if(a>0&&b>0&&sum<0) printf("Case #%d: true\n",i);
else if(a<0&&b<0&&sum>=0) printf("Case #%d: false\n",i);
else if(sum>c) printf("Case #%d: true\n",i);
else printf("Case #%d: false\n",i);
}
return 0;
}

本文标题:PAT A1065 A+B and C (64bit)

文章作者:GavinYGM

发布时间:2020年08月21日 - 18:08

最后更新:2020年08月21日 - 18:08

原始链接:http://www.gavinygm.cn/2020/08/21/PAT-A1065-A-B-and-C-64bit/

许可协议: 转载请保留原文链接及作者。