PAT1065. A+B and C
题目
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
代码
#include <iostream>
#include <cstdio>
using namespace std;
long long a,b,c;
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
long long ans=a+b;
if(a>0&&b>0&&ans<0)
{
printf("Case #%d: true\n",i);
continue;
}
if(a<0&&b<0&&ans>=0)
{
printf("Case #%d: false\n",i);
continue;
}
if(ans>c)
printf("Case #%d: true\n",i);
else
printf("Case #%d: false\n",i);
}
return 0;
}
思路
溢出只有两正数相加为负和两负数相加为正时发生。
注意两个负数相加溢出结果可能为0,《算法笔记》:
- 当A+B>=263时,显然有A+B>C,A+B会因超过long long的正向最大值而发生正溢出,由于题目给定的A和B最大均为263-1,故A+B最大为264-2,因此long long存储正溢出后的值的区间为[-263, -2],由(264-2)%(264)=-2可得右边界,所以当A>0 && B>0 && A+B<0 时,输出true。
- 当A+B<-263时,显然有A+B<C成立,但是A+B会因超过long long 的负向最小值而发生负溢出。由于题目给定的A和B的最小值为-263,故A+B最小为-264,因此使用long long 存储负溢出后的值的区间为[0, 263)。所以当 A<0 && B<0 &&="" a+b="">=0时为负溢出,输出false。
还有一个问题
a + b >= 0 ;
的写法不对,要存在另一个变量里才能比较,下面的写法才是对的,
ans = a + b ; ans >= 0 ;
update:和编译器有关,第一种写法G++过不了,换CLANG++成功。
codeblock在debug中遇到进程无法退出可以用
taskkill /im 进程名称 /F
TODO
[ ]
[牛客题解]: www.nowcoder.com/questionTerminal/3502cc5a5d80402f93823fd90f21325d
[ ] Java使用BigDecimal进行高精度计算