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;}
- PAT---A1065 A+B and C(20)
- PAT A1065 A+B and C (64bit) (20)
- 【PAT】A1065. A+B and C (64bit) (20)
- PAT A1065. A+B and C (64bit) (20)
- PAT-A1065 A+B and C (64bit)(模拟)
- PAT A1065. A+B and C (64bit)
- PAT A 1065. A+B and C (64bit) (20)
- PAT-A 1065. A+B and C (64bit) (20)
- PAT-A-1065. A+B and C (64bit) (20)
- 【PAT】1065. A+B and C (64bit) (20)
- 浙大PAT 1065. A+B and C (64bit) (20)
- PAT 1065. A+B and C (64bit) (20)
- PAT 1065. A+B and C (64bit) (20)
- ZJU-PAT 1065. A+B and C (64bit) (20)
- PAT 1065. A+B and C (64bit) (20)
- PAT 1065. A+B and C (64bit) (20)
- PAT 1065. A+B and C (64bit) (20)
- PAT:1065. A+B and C (64bit) (20)
- 数据库范式
- Flutter基础—定位对齐之大小比例
- NYOJ311完全背包
- 18. 4Sum
- (转)HTTP协议—— 简单认识TCP/IP协议
- PAT---A1065 A+B and C(20)
- 大数据Spark “蘑菇云”行动第102课:Hive性能调优之底层Hadoop引擎调优剖析和最佳实践
- sunny ngrok 使用简介
- OPT算法,FIFO算法,LRU算法,LFU算法的java程序
- ReactiveCocoa详解
- windows下硬盘安装centos
- adb命令记录
- Java设计模式(3)--代理模式
- 用HTML创建游戏中的元素用canvas~画方块~画圆: