浏览器标题切换
浏览器标题切换end

PTA1065 - A+B and C (64bit) - 大数相加问题

题意

给出T组数据,每次每组数据给出a、b、c三个数,范围在 [263,263]

如果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最大: 2311、long long最大:2631

  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\n",cas++);
        else if(a>0&&b>0&&w<0) printf("Case #%d: true\n",cas++);
        else if(w<=c) printf("Case #%d: false\n",cas++);
        else if(w>c) printf("Case #%d: true\n",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\n",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,可能数据测试点少!?

posted @   抓水母的派大星  阅读(100)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2020-02-27 寒假Day35:HDU3499
2020-02-27 寒假Day35:HDU1385-Minimum Transport Cost -Floyd路径输出(输出字典序小的)
点击右上角即可分享
微信分享提示