题目大意:
给出三个整数A,B,C,如果A+B>C就输出true,否则输出false;
算法思路:
注意到题目给定的数据范围,对于A,B,C都只能使用long long类型存储,其范围为[-2^63,2^63),而此题考察的是溢出问题。
对于正溢出:也就是A+B>=2^63时,由于long long最大为2^63-1,那么A+B最大为2^64-2,对2^64(long long表示的数据范围长度)取余得到-2,那么正溢出的数字在[-2^63,-2],也就是说,对于A>0,B>0,如果A+B<0就可以判定正溢出
对于负溢出:也就是A+B<-2^63时,由于long long最小值为-2^63,那么A+B最小为-2^64,对2^64(long long表示的数据范围长度)取余得到0,那么负溢出的数字在[0,2^63),也就是说,对于A<0,B<0,如果A+B>=0就可以判定负溢出。
对于没有溢出的情况,正常判断即可。
注意点:
1、必须得先进行求和然后在判断和C的大小,否则测试点1和2无法通过
2、对于负溢出,如果没有写等于0的判断条件,测试点2出错。
提交结果:
AC代码:
#include<cstdio>
using namespace std;
int main(){
int T;
scanf("%d",&T);
long long A,B,C;
for(int i=1;i<=T;++i){
scanf("%lld %lld %lld",&A,&B,&C);
long long sum = A+B;// 测试点1和2
if(A>0&&B>0&&sum<0){
// 正溢出一定大于C
printf("Case #%d: true\n",i);
}else if(A<0&&B<0&&sum>=0){// 测试点2考察等于0的情况
// 负溢出一定小于C
printf("Case #%d: false\n",i);
}else{
if(A+B>C){
printf("Case #%d: true\n",i);
}else{
printf("Case #%d: false\n",i);
}
}
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。