PAT A1065 A+B and C (64bit) (20分)
看似简单但是,需要考虑溢出的情况,有正溢出和负溢出。
因为A,B,C的范围为[-263,263],而long long的取值范围为[-263,263],所以相加会存在溢出的问题 注意A+B必须存放到longlong型变量后才能与C比较,否则会造成数据计算的错误
1,当A+B>=2^63时,显然A+B>C成立,但是A+B会超过long long的最大值,发生溢出,而A、B的最大值为263-1,所以A+B的最大值为264-2,所以使用long long存储后后溢出的值的区间为[-263,-2],【-2=(264-2)%2^64】
2,当A+B<-2^63时,显然A+B<C成立,但是A+B会超过long long的最大值,发生溢出,而A、B的最小值为-263,所以A+B的最小值为-264,所以使用long long存储后溢出的值的区间为[0,263),【0=(-264)】%2^64】
注意这个零,第三个测试点卡这个地方。
#include<cstdio>
using namespace std;
int main(){
long long A,B,C;
int n;
scanf("%d",&n);
bool flag;
for(int i = 1;i<=n;i++){
scanf("%lld %lld %lld",&A,&B,&C);
long long res = A+B;
if(A>0&&B>0&&res<0) flag = true;
else if(A<0&&B<0&&res>=0) flag = false;
else if(res>C) flag = true;
else flag = false;
if(flag==true){
printf("Case #%d: true\n",i);
}else{
printf("Case #%d: false\n",i);
}
}
return 0;
}