• PTA1065


    题意

    给出T组数据,每次每组数据给出a、b、c三个数,范围在 (left[-2^{63}, 2^{63} ight])

    如果a+b<=c输出false,a+b>c输出true 。

    思路

    话说我没啥思路其实,考虑过一位一位相加去判断,但是最后觉得代码肯定又长又乱还得调,于是乎,放弃了。

    第一种思路:

    1. 利用 正溢出后值小于0,负溢出后值大于等于0 这个知识点

    2. 当a<0&&b<0&&a+b>=0,为负溢出,所以a+b<=c,输出false
      当a>0&&b>0&&a+b<0,为正溢出,所以 a+b>c,输出true

    3. 代码见AC代码一。

    第二种思路:

    1. 直接利用long double的数据范围去进行加减判断大小即可。(double会一组数据都过不去)

    2. long double是C99里面新增的数据类型,相关内容可以查看:https://blog.csdn.net/hunzhangzui9837/article/details/85222209

    3. 代码见AC代码二。

    注意

    1. 比赛用scanf、printf,不要用cin cout,会出现奇怪的错误

    2. 尽量把需要多次用到的数据都放在一个变量中,比如 ll w=a+b

    3. long double输入用 %LF 或者 %llf

    4. int最大: (2^{31}-1)、long long最大:(2^{63}-1)

    5. 关于不同数据类型的字节大小:https://blog.csdn.net/ZongYinHu/article/details/46603255?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control&dist_request_id=59454c9f-7e24-4e76-878e-f0c1310bc236&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-7.control

    AC代码一

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    typedef long long ll;
    
    int main()
    {
        int T;
        cin>>T;
        int cas=1;
        while(T--)
        {
            ll a,b,c;
            // cin>>a>>b>>c;
            scanf("%lld %lld %lld",&a,&b,&c);
            ll w=a+b;
            if(a<0&&b<0&&w>=0) printf("Case #%d: false
    ",cas++);
            else if(a>0&&b>0&&w<0) printf("Case #%d: true
    ",cas++);
            else if(w<=c) printf("Case #%d: false
    ",cas++);
            else if(w>c) printf("Case #%d: true
    ",cas++);
        }
        return 0;
    }
    

    AC代码二

    这份代码用cin cout输入输出也可以过

    #include<iostream>
    #include<stdio.h>
    
    using namespace std;
    typedef long long ll;
    
    //a+b<=c输出false  a<0&&b<0&&a+b>=0
    // a+b>c输出true  a>0&&b>0&&a+b<0 正溢出
    
    int main()
    {
        int T;
        cin>>T;
        int cas=1;
        while(T--)
        {
            long double a,b,c;
            scanf("%llf %llf %llf",&a,&b,&c); // long double输入用%LF或者%llf
            printf("Case #%d: %s
    ",cas++,a+b>c?"true":"false");
        }
        return 0;
    }
    

    遗留的问题

    1. 为什么我往PTA上面提交相同的一份代码,每次每个测试点的耗时都不一样?
      这个博客可以参考看一下,但是我还是觉得存在问题:https://www.zhihu.com/question/23678530/answer/25374602

    2. 为什么代码一里面的输入把cin改成scanf就对了,不然PTA上第三个测试点错误。

    3. 在cin cout输入输出的时候,把a+b的和存起来就可以对两组数据,否则就只对一组

    4. 但是思路二利用long double,但是long double只是精确到18位小数,我觉得并不满足题目给定的数据范围,但是不知道为什么可以AC,可能数据测试点少!?

  • 相关阅读:
    判断是否IPv6网络
    Makefile使用库
    Makefile编译
    Makefile编译库
    lua定义一个简单的类
    c++ 注册类到 lua
    redis的安装
    yield return的作用
    使用boost的asio,io_service无法初始化
    apache+php+mysql的配置(转载)
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14456782.html
Copyright © 2020-2023  润新知