原题:https://pintia.cn/problem-sets/994805342720868352/problems/994805406352654336
题目大意
题目不难,主要输入3个数,A,B,C,然后判断A+B是否大于C,但是主要整数的范围是
[
−
2
63
,
2
63
]
[-2^{63},2^{63}]
[−263,263],若以若用long int
存储,则可能会超出表示范围,具体可参照 计算机组成原理。
所以,若
- A > 0, B > 0,但是 A+B < 0,就发生了正溢出,表明和超过了表示的上界;
- A < 0 ,B < 0,但是 A + B ≥ 0 ,就发生了负溢出,表明和超过了表示的下界。
于是乎,小明写出了下面这段代码
/* 1065 A+B and C (64bit) (20 分) */
#include<iostream>
using namespace std;
int main() {
int t;
long long a, b, c;
cin >> t;
for (int i = 1; i <= t; i++) {
printf("Case #%d: ", i);
cin >> a >> b >> c;
if (a > 0 && b > 0 && (a + b)< 0) printf("true\n"); // 正溢出
else if (a < 0 && b < 0 && (a + b) >= 0) printf("false\n"); // 负溢出
else if ((a + b) > c) printf("true\n");
else printf("false\n");
}
system("pause");
return 0;
}
正当小明为遇到这么简单的题,而暗自窃喜的时候,评判系统跟他开了个玩笑
此时,小明发现问题可能并没有那么简单,但是这突如其来的打击让聪明的小明也开始眉头紧锁起来。
他开始翻阅《计算机组成原理》一书,并浏览各大技术网站、论坛、知乎、微博,
终于,小明啥也没找到。。。。。。。
可是,午饭时间到了,于是乎,小明又迫不得已地去吃午饭,思考却从未停止。
一件更神奇的事情发生了,当小明吃完午饭回来之后,发现自己的代码居然多了一行,如下:
#include<iostream>
using namespace std;
int main() {
int t;
long long a, b, c;
cin >> t;
for (int i = 1; i <= t; i++) {
printf("Case #%d: ", i);
cin >> a >> b >> c;
long long sum = a + b; // 迷惑代码+1
if (a > 0 && b > 0 && (a + b)< 0) printf("true\n"); // 正溢出
else if (a < 0 && b < 0 && (a + b) >= 0) printf("false\n"); // 负溢出
else if ((a + b) > c) printf("true\n");
else printf("false\n");
}
system("pause");
return 0;
}
小明不解,但还是疑惑地点击了提交,于是乎,一件更疑惑的事情发生了
代码Accepted
了,但是,疑惑的小明又将多出来的代码删掉并提交了,终于,又出现了Error
的提醒。
上天仿佛是要告诉小明什么东西,于是乎,小明将代码重新修改了一遍,变成先求和再判断
并提交了,
这次又完美的Accepted
了,而且彷佛一切都没有发生过,因为,这次疑惑的代码也用上了。
#include<iostream>
using namespace std;
int main() {
int t;
long long a, b, c;
cin >> t;
for (int i = 1; i <= t; i++) {
printf("Case #%d: ", i);
cin >> a >> b >> c;
long long sum = a + b;
if (a > 0 && b > 0 && sum < 0) printf("true\n");
else if (a < 0 && b < 0 && sum >= 0) printf("false\n");
else if (sum > c) printf("true\n");
else printf("false\n");
}
system("pause");
return 0;
}
聪明的你能告诉小明,今天究竟发生了什么吗?