PAT---A1065 A+B and C(20)

来源:互联网 发布:市场营销大数据分析 编辑:程序博客网 时间:2024/06/02 13:46

**题目要求:**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;}
0 0