PAT训练题 分享

题目
题目如上
此题在做过后,发现难点在于数据类型的边际问题。

int的数据范围在-2147483648 ~ 2147483647
而若A、B的取值处于边界时就会出现问题,产生溢出。
尤其当A、B的取值为负边界时,会自动取反,变为正值。
而且做加法时易出现溢出。

当然,直接将数据类型改为long类型可以避免问题,但笔者认为并没有获得本题最为珍贵的知识。

故,愚者之见,求加不如求减,既然会有临界值,则整体改变值,达到相对的大小关系不变,而各值依旧存在数据类型范围中。
一下为代码:

#include<iostream>
using namespace std;
int main()
{
    int n, A, B, C;
	int i = 0;
	cin >> n;
	bool *p = new bool[n];
	while (i<n)
	{
		cin >> A >> B >> C;
		if (A < 0)
		{
			if (A + 1 > C - B+1)
				p[i] = true;
			else
				p[i] = false;
		}
		else 
		{
			if (A - 1 > C - B-1)
				p[i] = true;
			else
				p[i] = false;
		}
		i++;
	}
	for (int ii = 0;ii<i;ii++)
	{
		cout << "Case #" << ii + 1 << ": ";
		if (p[ii] == 0)
			cout << "false" << endl;
		else
			cout << "true" << endl;
	}
	delete[]p;
	return 0;
}

同样,笔者在讨论区域有看见更多的思路,有想法的朋友可以去看看。

笔者当时看见有朋友,采用除法,减少大小,令笔者眼前一亮,然而不知其中缘由,在int类型的边际值出现时,采用除法时会使值出现问题。

如图所示

总结:
在数据临界值时,int负值临界会取反再载入值。
保留相对关系,采用加减或乘除等值变化,将数值纳入目标范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值