PAT A 1065 A+B and C (64bit) (20分)

一、思路

(一)错误做法:使用long long存储,判断溢出

1.A、B均正数,相加小于等于0,则发生了溢出即A + B >= 2^63,而C在long long表示范围内,此时一定有A + B大于C,true成立。

2.均为负数且下溢时同理一定false成立;

3.正常情况,正常判断A + B是否大于C

这种方法是可以AC的,但这种方法和测试点都存在漏洞:若给定数据在long long范围内,是完全可行的;但数据范围是:-2^ 63到2^ 63,且2^ 63是long long中无法正确解释的,被错误解释为-2^ 63。因此即使可以通过测试点,仍不是正确的做法.
例如输入:
0 9223372036854775808 1 会判断A + B < C;
9223372036854775808一定会被存储为-9223372036854775808处理,在这基础上,关于2^ 63的输入都无法做出正确判断。

因此,通过测试点的代码未必拥有正确性。

(二)正确解法

使用更大的long double类型存储,使用有更高的精度和表示范围的类型来判断。
注意:long double类型scanf()格式控制符为%llf。

二、代码

#include <cstdio>
int main()
{
    int T;
    scanf("%d", &T);
    for( int i = 1; i <= T; ++i )
    {
        long double A, B, C;
        scanf("%llf %llf %llf", &A, &B, &C);
        printf("Case #%d: %s\n", i, A + B > C ? "true":"false");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值