题意:
给出三个64位的整型数A,B,C(范围在[-2^63^, 2^63^]),比较A+B是否大于C。
思路:
一开始我想这题考察的是大整数运算,因为long long的范围是[-2^63, 2^63),取不到2^63。但是,看过《算法笔记》后发现,这一题不需要用BigN的方式来做,考察的是整型的溢出。需要说明的是,本题给出的范围[-2^63, 2^63]应该是写错了,经过测试,发现A或B并没有取到2^63的情况!范围应该是[-2^63, 2^63),因此可用long long int型整数存储数据。(PAT坑!)
若A>0,B>0,而A+B<0,说明A+B的值超过了最大正数的表示范围,因而发生了正溢出,显然有A+B>C;
若A<0,B<0,而A+B>=0,说明A+B的值超过了最大负数的表示范围,因而发生了负溢出,显然有A+B<C;
而其余未发生溢出的情况,则按正常的比较即可。
或许有人会对上面的边界不知如何确定,可以自己验证一下。(其中<limits.h>包含了常数LLONG_MAX和LLONG_MIN,当然也可以自己定义)。可见,若A,B都是小于0的情况,溢出的边界应该 >=0 ,这里会卡1个测试点。
#include#include int main(){ //long long int LLONG_MAX=0x7fffffffffffffff; //long long int LLONG_MIN=-LLONG_MAX-1; printf("%lld\n",LLONG_MAX+LLONG_MAX);//两个最大long long相加,结果为-2 printf("%lld\n",LLONG_MIN+LLONG_MIN);//两个最小long long相加,结果为0 return 0;}
代码:
#includeint main(){ int T; long long int a,b,c,sum; scanf("%d",&T); for(int i=1;i<=T;i++){ scanf("%lld%lld%lld",&a,&b,&c); sum=a+b; printf("Case #%d: ",i); if(a>0 && b>0 && sum<0) printf("true\n"); else if(a<0 && b<0 && sum>=0) printf("false\n"); else if(sum>c) printf("true\n"); else printf("false\n"); } return 0;}