题目链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805406352654336
题目大意:
给出三个整数A,B,C,要求判断是否有A+B>C。
本题需要注意点:整数A,B,C的取值范围,[-2^63, 2^63]。根据计算机组成原理的知识,理论上不难分析得出下面的结论:
short与short int可以表示的的最大范围是:-32768<---->32767 [-2^15, 2^15)
int、long int、long 可以表示的最大范围是:-2147483648<---->2147483647 [-2^31, 2^31)
long long 可以表示的最大范围是:-9223372036854775808<--->9223372036854775807 [-2^63, 2^63)
详见:
原文链接:https://blog.csdn.net/u012372584/java/article/details/77824218
思路分析:
根据A,B,C的取值范围,需要用长整型long long存储,同时,还需要考虑溢出,还需要分为正溢出和负溢出。
当A+B的和大于等于2^63时,此时发生正溢出,而正溢出后,值的取值范围为[-2^63, -2]。(当A+B的值达到2^63时,计算机中存储的二进制数将是ox8000000000000000,表示-2^63,当A,B取最大值均为2^63-1,因此A+B最大为2^64-2,此时计算机中存储的二进制数将是oxfffffffffffffffe,表示-2)
同上述分析,不难得出当A+B的和小于-2^63时,将发生负溢出,而负溢出后,值的取值范围为[0, 2^63)。
参考代码:
#include<cstdio>
typedef long long ll;
ll a,b,c,res;
int main(){
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%ld%ld%ld",&a,&b,&c);
res=a+b;
printf("Case #%d: ",i);
if(a>0&&b>0&&res<0)
printf("true\n");
else if(a<0&&b<0&&res>=0)
printf("false\n");
else if(res>c)
printf("true\n");
else
printf("false\n");
}
return 0;
}