**题目要求:**Given three integers A, B and C in [-2^63, 2^63], 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
参考代码:(此代码有问题,仅供参考或者提供思路,如发现问题还望留言提醒,谢谢)
个人认为,题目中a.b.c的范围可能是[-2^63,2^63)范围,右端点无法取到,这样正好是long long数据类型的取值范围。如果右端点能取到,则必须使用更大的数据类型,如果那样的话,则无法判断是否溢出所给范围。
#include <iostream>
using namespace std;
int main()
{
int N; //输入的数据组数,即将要循环的次数
cin >>N;
int k = N; //用来记录N的值,借此判断何时
//到达最后一行
int i = 1;
int q[1000]={0}; //记录每一次的判断结果,从q[1]开始记录
int flat = 0; //没有到达最后一行前,都使flat为0
while(N--)
{
long long a,b,c,sum;
cin >> a>>b>>c;
sum = a + b; //用来记录a+b的和
if(i==k) //将最后一行设置成一个标记,1代表最后一行;为0则不是最后一行
flat = 1;
if(((a<0)&&(b<0)&&(sum>=0)&&(flat==0))||((sum<=c)&&(flat == 0)))
// 当a<0且b<0且sum>=0,此情况为负溢出。当a与b都很小,则和可能会出现溢出,而溢出后的值可能>=0.当恰巧出现负溢
//出时,就是比题意所给范围左端点再小一点,即变为题意所给范围的右端点,右端点的整数最大为2^63-1(a+b的和负溢出
//时的一个端点)。而如果a.b都为最小值-2^63,则和为-2^64。 (-2^64)%2^64=0即为另一个端点。所以当a.b都足够小,
//造成负溢出,则和为[0,2^63-1] 即sum>=0(此为if条件的来源)。负溢出情况下,两个<0的数的和由于足够小,都溢
//出了,肯定比没有溢出的c小,所以不符合a+b>c,即为false。
q[i] = 0;
else if(((a>0)&&(b>0)&&(sum<0)&&(flat==0))||((sum>c)&&(flat == 0)))
//当出现正溢出时,(a>0)&&(b>0)&&(sum<0),因为当两个值都足够大时,a+b的和可能会溢出,此时溢出的值可能<0。
//当恰巧出现溢出时,a+b的溢出的和的一个端点变为题意所给范围的左端点(比右端点再大点,即变为左端点)-2^63。
//而当a.b两个值都为最大值,即都为2^63-1时,和为2^64-2。(2^64-2)%(2^64)=-2即为另一个端点。
//所以,在出现正溢出的条件下,和的范围为[-2^63,-2].所以sum<0(此为if条件来源)。而出现正溢出时,
//说明a+b的值足够大,大的已经溢出了,所以肯定比没有溢出的c大,即符合题意a+b>c,为true
q[i] = 1;
else if(((a<0)&&(b<0)&&(sum>=0)&&(flat==1))||((sum<=c)&&(flat == 1)))
q[i] = 2;
else if(((a>0)&&(b>0)&&(sum<0)&&(flat==1))||((sum>c)&&(flat == 1)))
q[i] = 3;
i++;
}
for(int j=1;j<i;j++)
{
switch (q[j]){
case 0:cout << "Case #"<<j<<": false"<<endl;break;
//当q[j]为0时,说明flat = 0,即不为最后一行,则需要输出换行符
case 1:cout << "Case #"<<j<<": true"<<endl;break;
case 2:cout << "Case #"<<j<<": false";break;
// 当q[j]为2时,说明flat = 1,即为最后一行,则不需要输出换行符
case 3:cout << "Case #"<<j<<": true";break;
}
}
return 0;
}
本文介绍了一个编程问题,要求判断三个整数A、B和C的关系,即A+B是否大于C。通过分析不同情况下的整数溢出问题,并提供了一段示例代码,帮助读者理解如何正确地进行判断。
989

被折叠的 条评论
为什么被折叠?



