关于算法-数据结构:PAT甲级1065-AB-and-C-64bit

6次阅读

共计 855 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心:

给出三个整数 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;
}
正文完
 0