(PAT Advanced) 1065 A+B and C (64bit) (迷惑的小明+整数溢出判断) C++

原题: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;
}

聪明的你能告诉小明,今天究竟发生了什么吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值