题目链接->link
题意描述
判断A+B>C,特殊在A,B范围都超出long long int的范围,所以要作溢出判断。
思路
- 首先,由计算机组成原理知识,long long int 最大范围为[-263,263-1],因为内存中用补码表示。又因为题目给出A,B范围为[-263,263],(此处右边界应该取不到,因为263补码表示是-263,这样就无法区分左右边界了)故有可能发生正溢出和负溢出。
- 正溢出情况下,A+B取[263,264-2],对应long long int截断溢出位后范围位[-263,-2],因为263-264=-263;264-2-264=-2。
- 负溢出情况下,A+B取[-264,-263-1],对应long long int截断溢出位后范围位[0,263-1],因为-264+264=0;-263-1+264=263-1。
- 还要注意判断溢出时要先用long long int 保存A+B结果。
- 取巧的做法可以用long double表示,因为long double范围位为128位,故不存在溢出。
代码
- 用long long int:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
int t,i;
scanf("%d",&t);
long long int a,b,c;
for(i=1;i<=t;i++){
scanf("%lld %lld %lld",&a,&b,&c);
long long n=a+b;
if(a>0&&b>0&&n<0)printf("Case #%d: true\n",i);
else if(a<0&&b<0&&n>=0)printf("Case #%d: false\n",i);
else if(n>c)printf("Case #%d: true\n",i);
else printf("Case #%d: false\n",i);
}
return 0;
}
- 用long double:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
using namespace std;
int main(){
int t,i;
scanf("%d",&t);
long double a,b,c;
for(i=1;i<=t;i++){
cin>>a>>b>>c;
//long long n=a+b;
//if(a>0&&b>0&&n<0)printf("Case #%d: true\n",i);
// else if(a<0&&b<0&&n>=0)printf("Case #%d: false\n",i);
if(a+b>c)printf("Case #%d: true\n",i);
else printf("Case #%d: false\n",i);
}
return 0;
}