• 【PAT(甲级)】1065 A+B and C (64bit)[相加时关于编译器的错误]


    Given three integers A, B and C in (−2^{63},2^{63}), you are supposed to tell whether A+B>C.

    Input Specification:

    The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line containing three integers A, B and C, separated by single spaces.

    Output Specification:

    For each test case, output in one line Case #X: true if A+B>C, or Case #X: false otherwise, where X is the case number (starting from 1). Each line should ends with '\n'.

    Sample Input:

    3
    1 2 3
    2 3 4
    9223372036854775807 -9223372036854775808 0

    Sample Output:

    Case #1: false
    Case #2: true
    Case #3: false

    解题思路:

    给出的数字在  (−2^{63},2^{63})的范围内,也就是long long int 的范围内,那么两个long long int 相加如果正数变成负数,说明溢出,也就是肯定大于第三个数;如果两个负数相加,变成正数,那么就是负溢出,肯定小于第三个数。

    易错点:

    代码大家应该都能按照这个思路敲出来,但是有个小bug,例如你用pat上的C++(g++)的编译器时:

    如果你不把注释掉的代码加上,那运行结果就会出错;

    但如果你用的时C++(clang++)的编译器时,你就可以不用加上注释掉的那行代码。

    本质原因应该是因为如果你不定义和的类型的话,有些编译器会把long long int类型数字相加默认变成long int 类型的相加,就会导致结果出错。 

    同一段代码:

            这是C++(g++)编译器的运行结果:

            这是C++(clang++)的运行结果:

    代码:  

    1. #include
    2. using namespace std;
    3. int main(){
    4. int T;
    5. scanf("%d",&T);
    6. long long int A,B,C;
    7. for(int i=0;i
    8. scanf("%lld %lld %lld",&A,&B,&C);
    9. // long long int sum;
    10. // sum = A+B;
    11. if(A>0&&B>0&&A+B<=0){
    12. printf("Case #%lld: true\n",i+1);
    13. }else if(A<0&&B<0&&A+B>=0){
    14. printf("Case #%lld: false\n",i+1);
    15. }else{
    16. if(A+B>C){
    17. printf("Case #%lld: true\n",i+1);
    18. }else{
    19. printf("Case #%lld: false\n",i+1);
    20. }
    21. }
    22. }
    23. return 0;
    24. }

  • 相关阅读:
    eyb:Redis学习(3)
    【SQL实用技巧】-- 分组内求topN问题
    SOME/IP学习笔记3
    【Java】函数式接口
    操作系统:2.3.5经典同步问题(1)——生产者消费者问题,多生产者多消费者问题
    『现学现忘』Docker命令 — 18、镜像常用命令
    【AT32】雅特力固件库开发入门(视频连载中)
    客户心声 | 四川省人社厅杨玉成一行充分肯定桂溪街道劳动保障工作信息化建设平台
    Python 循环缓冲区
    ROS机械臂 Movelt 学习笔记2 | Move Group 接口 C++
  • 原文地址:https://blog.csdn.net/weixin_55202895/article/details/126827884