1065. A+B and C (64bit) (20)

时间:2022-09-01 09:57:38
题目链接:http://www.patest.cn/contests/pat-a-practise/1065
题目:

Given three integers A, B and C in [-263, 263], 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

分析:
原本以为是用高精度整数做的,但是这是__int64能够解决的,加上对于溢出的判定即可。
后来出了问题,问了姥姥。
姥姥的回复:标程是用减法判断的,比如 a<0LL&&b<0LL&&b<(long long)0x8000000000000000LL-a
而后来一直有两个答案是错的,直到我把a+b用sum暂存才解决
AC代码:
#include<stdio.h>
//#include <limits.h>     //定义各种数据类型最值的常量

bool check(long long a, long long b, long long c){
 /*
 if (a >= 0 && b >= 0) {
  if (a > LLONG_MAX - b) return true;
 }
 else if (a <= 0 && b <= 0) {
  if (a < LLONG_MIN - b) return false;
 }
 *///通过最值来判断
 long long sum;
 sum = a + b;
 if (a > 0 && b > 0 && sum <= 0) //两个正数相加溢出
  return true;
 else if (a < 0 && b < 0 && sum>= 0)//两个负数相加溢出
  return false;
 else
  return sum > c;
}
int main(void){
 freopen("F://Temp/input.txt", "r", stdin);
 int n;
 scanf("%d", &n);
 for (int i = 0; i < n; i ++){
  long long a, b, c;
  scanf("%lld%lld%lld", &a, &b, &c);
  printf("Case #%d: %s\n", i + 1, (check(a, b, c) ? "true" : "false"));
 }
 return 0;
}


截图:
1065. A+B and C (64bit) (20)
——Apie陈小旭