PAT 乙级(1) A+B和C
题目
给定区间[-231, 231]内的3个整数A、B和C,请判断A+B是否大于C。
输入描述
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出描述
对每组测试用例,如果A+B>C,在一行中输出“Case #X: true”,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
示例1
输入
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
输出
Case #1: false
Case #2: true
Case #3: true
Case #4: false
思考和总结
- 各种变量类型的范围
变量类型 | 大小(位数) | 范围(下界) | 范围(上界) |
---|---|---|---|
char | 8 | -27 | 27-1 |
unsigned char | 8 | 0 | 28-1 |
[signed] short [int] | 16 | -215 | 215-1 |
unsigned short [int] | 16 | 0 | 216-1 |
[signed] int | 32 | -231 | 231-1 |
unsigned [int] | 32 | 0 | 232-1 |
[signed] long [int] | 32 | -231 | 231-1 |
unsigned long [int] | 32 | 0 | 232-1 |
[signed] long long [int] | 64 | -263 | 263-1 |
unsigned long long [int] | 64 | 0 | 264-1 |
float | 32 | -3.40282*1038 | 3.40282*1038 |
double | 64 | -1.79769*10308 | 1.79769*10308 |
long double | 96 | -1.79769*10308 | 1.79769*10308 |
- 思路
(1)题目中给定的区间明显已经完全囊括我们int整数类型的范围,所以在我们比较A+B的时候会出现两种情况:
①A与B异号,那么此时A+B不会溢出int范围;
②A与B同号,那么此时A+B就会溢出int范围,这时就需要额外处理;
(2)在A与B同号的前提下,我们进行逆向思考,考虑A>C-B,就需要考虑C-B的情况,也是两种:
①C与B同号,直接比较即可;
②C与B异号,A肯定与C异号且与C-B异号,可直接通过A与C的符号判断大小;
具体代码(c++)
#include <iostream>
using namespace std;
bool check(int a)
{
if (a > 0)
return 1;
else
return 0;
}
int main()
{
int num;
cin >> num;
long long a,b,c;
for(int i = 1;i <= num;++i)
{
cin >> a >> b >> c;
cout << "Case #" ;
if (check(a) == check(b))
{
if (check(b) == check(c))
{
if (a > c - b)
cout << i << ": true"<< endl;
else
cout << i << ": false"<< endl;
}
else
{
if (check(a) > check(c))
cout << i << ": true"<< endl;
else
cout << i << ": false"<< endl;
}
}
else
{
if (a + b > c)
cout << i << ": true"<< endl;
else
cout << i << ": false"<< endl;
}
}
return 0;
}
暴力解法
因为longlong长整型的范围并不会超出,可以直接使用,直接代码如下:
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
long long a,b,c;
for(int i = 1;i <= num;++i)
{
cin >> a >> b >> c;
cout << "Case #" ;
if (a + b > c)
cout << i << ": true"<< endl;
else
cout << i << ": false"<< endl;
}
return 0;
}
注:以上思路均来源于网上。文章目的只是为了自己学习总结回顾,欢迎指出错误,相互学习。如有冒犯,请联系删除,谢谢!