题意
给出三个整数A,B,C,如果A+B>C,则输出true;否则,输出false。
分析
由于longlong的范围是[-263,263),因此题目中给出的两个整数相加有可能会溢出(正溢出或负溢出),直接进行大小判断会造成错误,在计算机组成原理中会指出,如果两个正数之和等于负数或是两个负数之和等于正数,那么就是溢出。对于溢出后的具体范围,可以进行如下分析:
①当A+B≥263时,显然有A+B>C成立,但A+B会因超过long long的正向最大值而发生溢出。由于题目给定的A和B最大均为263-1,故A+B最大为264-2,因此使用而发生正溢出long long存储正溢出后的值的区间为[-263,-2] (由(264-2)%(264)=-2可得右边界)。所以当A>0,B>0,A+B<0时为正溢出,输出true
②当A+B<2时,显然有A+B<C成立,但A+B会因超过long long的负向最小值而发生负溢出。由于题目给定的A和B最小均为2,故A+B最小为-2,因此使用long long存储负溢出后的值的区间为[0,263)(由(-264)%264=0可得左边界)所以,当A<0.B<0,A+B≥0时为负溢出,输出false。
③在没有溢出的情况下,当A+B>C时,输出true;当A+B≤C时,输出false。
参考代码
#include<cstdio>
int main(){
int T,tcase=1;
scanf("%d",&T);
while(T--){
long long a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);
long long res=a+b;
bool flag;
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",tcase++);
}else{
printf("Case #%d: false\n",tcase++);
}
}
return 0;
}
来源于《算法笔记》。代码简单的不能在简单了,精华。