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


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).

Sample Input:

3
1 2 3
2 3 4
9223372036854775807 -9223372036854775808 0

Sample Output:

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

思路

  • 当正溢出时,A + B 大小的范围区间为 [2^63, 2^64 - 2],所以溢出后的区间为 [-2^63, -2]。所以,当 A > 0, B > 0, A + B < 0 时,为正溢出,输入 true。
  • 当负溢出时,A + B 大小的范围区间为 [-2^64, -2^63 - 1],所以溢出后的区间为 [0, 2^63 - 1]。所以,当 A < 0, B < 0, A + B >= 0 时为,为负溢出,输出 false。
  • 在没有溢出的情况下,正常比较。

注意点

  • A + B 必须存放到 long long 型变量中才可与 C 进行比较,而不可以在 if 的条件中直接相加与 C 比较,否则会造成后两组数据错误。
#include <cstdio>

int main() {
    int t;
    long long a, b, c;
    bool flag;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++) {
        scanf("%lld %lld %lld", &a, &b, &c);
        long long res = a + b;
        if (a > 0 && b > 0 && res < 0) {
            flag = true;
        } else if (a < 0 && b < 0 && res >= 0) {
            flag = false;
        } else if (res > c) {
            flag = true;
        } else {
            flag = false;
        }
        printf("Case #%d: %s\n", i, flag ? "true" : "false");
    }
    return 0;
}

文章作者: 吴鑫康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吴鑫康 !
评论
 上一篇
PAT乙级 1010 一元多项式求导 (25分) PAT乙级 1010 一元多项式求导 (25分)
设计函数求一元多项式的导数。(注:x^n(n为整数)的一阶导数为nx^{n−1}。) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。 输出格式:以与输入相同的格式输出导数多项式非
2020-03-17
下一篇 
Dubbo微服务影院系列(5):Dubbo基本特性(用户模块开发) Dubbo微服务影院系列(5):Dubbo基本特性(用户模块开发)
章节概要 学会 API 网关权限验证和其他服务交互 学会开发 SpringBoot 的自定义配置 学会 Dubbo 负载均衡策略选择和使用 修改 Guns 中的 JWT 模块 增加忽略验证 URL 配置 修改返回内容匹配业务 增加 Thr
2020-03-11
  目录