数值溢出 PAT. A1065

题目: https://www.patest.cn/contests/pat-a-practise/1065

如果用大数运算会麻烦许多吧!

关于数值范围
题目中的范围为[-2^63, 2^63],应该是给错了,改为[-2^63, 2^63);不然long long存储2^63会自动变成-2^63,这时候只能用带负数的大数运算了。测试数据确实也没有A或B等于2^63的情况。

#include<cstdio>
#include<iostream>
using namespace std;

int main() {
    int n;
    long long a, b, c;
    scanf("%d", &n);
    /*
    //范围[-2^63, 2^63),  long long 8字节=64bit
    // 溢出判断
    // a > 0, b > 0, c > 0; a + b < 0, 输出 true 
            溢出后的区间 为 [-2^63, -2]
    // a < 0, b < 0, c < 0; a + b < 0, 输出 false
            移除后的区间 为 [0, 2^63)
    */
    int flag;
    for (int i = 0; i < n; i++) {
        scanf("%lld%lld%lld", &a, &b, &c);
        long long temp = a + b;
        if (a > 0 && b > 0 && temp < 0) flag = 1;
        else if (a < 0 && b < 0 && temp >= 0) flag = 0;
        else if (temp > c) flag = 1;
        else  flag = 0;

        //输出
        if (flag == 1) printf("Case #%d: true\n", i + 1);
        else printf("Case #%d: false\n", i + 1);
    }

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/79103826