题目粗心:
给出三个整数 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;
}