[PAT解题报告] A+B and C
简单题,给定A, B, C,判断是否有A + B > C。 这3个数都是64-bit整数,所以要用long
long。但是加法可能溢出……
clmits头文件包含了
LLONG_MAX和LLONG_MIN
我们其实要判断
(1) A + B > LLONG_MAX, 即 A > LLONG_MAX - B,
注意B可能是负数,这样 LLONG_MAX -
B也越界了,而且只有B是非负数,它与A的和才可能上溢出,所以我们判断(B >= 0) && (
A >
LLONG_MAX - B) 这时A + B > LLONG_MAX了,肯定超过C了,根本不用看C。
(2) 类似的当B <= 0时 (其实A也要<= 0),A + B可能小于 LLONG_MIN,
于是判断 A < LLONG_MIN - B
, 等号右边虽然是减法,但得到的值比 LLONG_MIN大……这样A + B < LLONG_MIN了,肯定不C小,根本不用看C
如果不在这两种情况,A + B是“正常”的,不会上下溢出。
直接求和判断就好了……
#include <cstdio> #include <cstring> #include <string> #include <climits> using namespace std; bool make(long long a, long long b, long long c) { if ((b >= 0) && (a > LLONG_MAX - b)) { return true; } if ((b <= 0) && (a < LLONG_MIN - b)) { return false; } return a + b > c; } int main() { int n; scanf("%d",&n); for (int i = 1; i <= n; ++i) { long long a,b,c; scanf("%lld%lld%lld",&a,&b,&c); printf("Case #%d: %s\n",i, make(a, b, c)?"true":"false"); } return 0; }
原题链接 : http://www.patest.cn/contests/pat-a-practise/1065