AC版本
//书上的想法是先把相加的结果存储到res中,通过判断两数正负和res正负来判断是否溢出
//不溢出的话,再用res和c比较。//通过flag(注意是布尔型的)来表示true 和flase,到最后一起输出,比较简便
#include<stdio.h>
int main(){
int T,tcase=1;
//long long a=0,b=0,c=0;
scanf("%d",&T);
while(T--){
long long a,b,c;
scanf("%lld%lld%lld",&a,&b,&c);// 这个地方一开始写成了%d,注意
long long res=a+b;//可能溢出,但是溢出也会有结果,在long long 范围内的结果。双正相加结果为负正溢出,双负相加结果为正负溢出
//如果一正一负相加,结果不可能溢出的
bool flag;
if(a>0&&b>0&&res<0){
//说明是正溢出
flag=true;
}
else if(a<0&&b<0&&res>=0){// 这个地方极其注意是>=0,但是我想不懂为什么这里要特殊注意,而上面不要。应该是最小比最大多1的问题吧
//说明是负溢出
flag=false;
}
else if(res>c)
//正常相加后结果大于c
flag=true;
else
flag=false;
if(flag==true)
printf("Case #%d: true\n",tcase++);
else
printf("Case #%d: false\n",tcase++);
}
return 0;
}
dec版本
//我的这个做法似乎是栈溢出,也可能不是。。为什么不能成功我不懂不懂
//没有错误,有警告,并且运行结果不是全部正确
//明确一点,在c语言中,有int——4个字节(10^9以内,-2^31~2^31,对应%d),long long——8个字节(-2^63~2^63,对应%lld)
#include<cstdio>
int main(){
//这题其实想到先加起来和固定边界值比较一下,解决就非常easy了
int n;
long long a=0,b=0,c=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld%lld",&a,&b,&c);
if(a+b>1L<<63){
//说明必定比c大
printf("Case #%d:true\n",i);
}
else if(a+b<-(1L<<63)){//是否是2^63写的不对呢?
//说明必定比c小
printf("Case #%d:false\n",i);
}
else{
//说明 -2^63<a+b2^63,所以可以比较大小了
if(a+b>c)
printf("Case #%d:true\n",i);
else
printf("Case #%d:false\n",i);
}
}
return 0;
}