a+b>c和temp=a+b; temp>c的区别?

Merlone 2014-08-04 04:05:01
问题来源于PAT的一道题目,Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C.
我的代码中有一个地方,if (a + b > c)这样提交一直有两个测试用例是答案错误,但我换成if (temp > c)就通过了。
这是什么原因?
请大神具体解释,不要什么文字不一样= =不是文字游戏。
跪谢!!!
/************************************
This is a test program for anything
Enjoy IT!
************************************/

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <fstream>
#include <string>
#include <cmath>
using namespace std;

int main()
{
/*ifstream cin;
cin.open("in.txt");
ofstream cout;
cout.open("out.txt");*/
//////////////////////////////////////////////////////////////////////////
// TO DO Whatever You WANT!
int T;
cin >> T;
int count = 0;
while (T--)
{
long long int a, b, c, temp;
cin >> a >> b >> c; // 输入a, b, c
temp = a + b;
a + b < c;
if (a > 0 && b > 0) // 正数
{
//////////////////////////////////////////////////////////////////////////
if (a + b <= 0) // 溢出
{
cout << "Case #" << ++count << ": " << "true" << endl;
}
else
{
if (a + b > c) // 输出
{
cout << "Case #" << ++count << ": " << "true" << endl;
}
else
{
cout << "Case #" << ++count << ": " << "false" << endl;
}
}
}
else if (a < 0 && b < 0) // 负数
{
//////////////////////////////////////////////////////////////////////////
if (a + b >= 0) // 溢出
{
cout << "Case #" << ++count << ": " << "false" << endl;
}
else
{
if (a + b > c) // 输出
{
cout << "Case #" << ++count << ": " << "true" << endl;
}
else
{
cout << "Case #" << ++count << ": " << "false" << endl;
}
}
}
else // 异号可以相加
{/*************************************************************************************************/
if (a + b > c) /**这里非常奇怪,写temp > c可以通过AC,写a + b > c就有两个答案错误**/
{
cout << "Case #" << ++count << ": " << "true" << endl;
}
else
{
cout << "Case #" << ++count << ": " << "false" << endl;
}
}
}
//////////////////////////////////////////////////////////////////////////
// system("pause");
return 0;
}
...全文
347 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Magic旭 2014-08-05
  • 打赏
  • 举报
回复
这个是优先级的问题,你应该写成:if((a+b)>c),就没问题了
幻夢之葉 2014-08-05
  • 打赏
  • 举报
回复
默默围观,顺便mark。
xiaohuh421 2014-08-05
  • 打赏
  • 举报
回复
这种题目往往会很注重细节处理. 比如溢出什么的意外情况. if( a+b > c) 这样的写法显然存在很多漏洞的.
我看你有戏 2014-08-05
  • 打赏
  • 举报
回复
一个常数默认为int吧 会先把long long 转成int 后比较 最好是在常数前面加转换 long long (0) 这样搞
勤奋的小游侠 2014-08-05
  • 打赏
  • 举报
回复
刚测试了一下,只能说这个系统让人蛋疼。我认为是这个系统的bug。楼主不用纠结了。
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 24 楼 lm_whales 的回复:
1)long long int 可储存数的范围是 [-2^63, 2^63-1]
2)long long int 可表示数的范围是 [-2^63-1, 2^63-1];

所以
long long int 表示 [-2^63, 2^63] 的数,是有问题的
1)不能表示 -2^63,把-9223372036854775808 = -2^63
表示为-9223372036854775807-1 = -2^63-1 则,可以用long long int 储存这个数。
2)不能储存 2^63 ,2^63 = 9223372036854775808 这个数不能用long long int 表示,储存。
3)读数,计算,应该不能有溢出。
-2^63 = -9223372036854775808
读取数据的时候,已经溢出。

所以这里最好另想办法处理。

另外,如果给你 2^63 = 9223372036854775808 这个数据;
你的程序,无论如何,都不能正确读取数据。
结果也不会正确。

谢谢你的耐心解释!
我避开了数的表示,用的其他方法判断的;程序可以完成功能!
不过现在的问题已经不是long long int之类的类型问题,而是temp = a + b;放在里面和外面对于我们来讲都是一样的,但是机器做的时候为什么会得到不同的结果?这是我想弄明白的;
具体示例请看【#12楼】
然后给你看两个不同的结果;
【#12楼第一个程序(temp = a + b;放在if外面)】

【#12楼第二个程序(temp = a + b;放在if里面)】
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 23 楼 haifeng3326 的回复:
另外,你在12楼写的通不过的问题我这里也没有问题,答案都正确

你是在本地跑的吧?
我在本地测试也都正确,而且把temp = a + b; 放在里面和外面应该都一样。
但是OJ(online judge)不通过...
所以肯定还是有微观上的差异我们没有考虑到。
lm_whales 2014-08-05
  • 打赏
  • 举报
回复
1)long long int 可储存数的范围是 [-2^63, 2^63-1] 2)long long int 可表示数的范围是 [-2^63-1, 2^63-1]; 所以 long long int 表示 [-2^63, 2^63] 的数,是有问题的 1)不能表示 -2^63,把-9223372036854775808 = -2^63 表示为-9223372036854775807-1 = -2^63-1 则,可以用long long int 储存这个数。 2)不能储存 2^63 ,2^63 = 9223372036854775808 这个数不能用long long int 表示,储存。 3)读数,计算,应该不能有溢出。 -2^63 = -9223372036854775808 读取数据的时候,已经溢出。 所以这里最好另想办法处理。 另外,如果给你 2^63 = 9223372036854775808 这个数据; 你的程序,无论如何,都不能正确读取数据。 结果也不会正确。
haifeng3326 2014-08-05
  • 打赏
  • 举报
回复
另外,你在12楼写的通不过的问题我这里也没有问题,答案都正确
haifeng3326 2014-08-05
  • 打赏
  • 举报
回复


a+b>c ,输出true
haifeng3326 2014-08-05
  • 打赏
  • 举报
回复
引用 20 楼 czl_chen 的回复:
[quote=引用 16 楼 haifeng3326 的回复:]
....读读题,谢谢= =a + b > c才输出true[/quote] a+b<c,输出的是false,有错吗???
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 16 楼 haifeng3326 的回复:
....读读题,谢谢= =a + b > c才输出true
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 17 楼 Idle_ 的回复:
也许因为if语句判断的是表达式结果为int,所以if( a + b > c )中a + b 转成int了
if(((long long int)(a + b)) < c)也是不可以的。 而且现在的问题是temp = a + b的位置,请看12楼
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 15 楼 haifeng3326 的回复:
我这里没问题啊,直接用的你的代码
代码是对的啦~不知道区别。。
阿呆_ 2014-08-05
  • 打赏
  • 举报
回复
也许因为if语句判断的是表达式结果为int,所以if( a + b > c )中a + b 转成int了
haifeng3326 2014-08-05
  • 打赏
  • 举报
回复
haifeng3326 2014-08-05
  • 打赏
  • 举报
回复



我这里没问题啊,直接用的你的代码
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 13 楼 chamberlain12 的回复:
longlong 删了
请看题目要求。。。a、b、c范围是 [-2 ^ 63, 2 ^ 63],还要删了long long? 而且问题不在于long long,在于执行语句的位置。
chamberlain12 2014-08-05
  • 打赏
  • 举报
回复
longlong 删了
Merlone 2014-08-05
  • 打赏
  • 举报
回复
引用 11 楼 lovesmiles 的回复:
[quote=引用 10 楼 czl_chen 的回复:] [quote=引用 4 楼 leiyuan828 的回复:] a + b 只有赋值后才可以判断是否溢出,因为他们的范围是-2^63 ~ 2^63 ,所以两个数相加后的范围应该是-2^64~ 2^64而long long 的范围是-2^63 ~ 2^63 -1,所以要判断溢出,而题目里给出的a b的范围是2^63 超出 long long 的范围,所以这里是一个陷阱。所以先赋值后判断是否溢出
你说的这种溢出是同号才会把,异号怎么会溢出?这个条件是异号的情况才会进入的。[/quote] 换成 !(c>=a+b) 这样看看能不能通过?[/quote] 一样的问题。其实这个题目我纠结的不是过不过,而是为什么那样会不通过; =============================================================== 而且现在的本质问题已经不是a + b 和 temp的问题了!!! 我刚发现,把temp = a + b;放在大if判断外面就能通过,而放在里面就不行! 这是能通过的!!!

		long long int a, b, c, temp;
		cin >> a >> b >> c; // 输入a, b, c
/////////////////////////////////////////////////////////////////////////
		temp = a + b;
/////////////////////////////////////////////////////////////////////////
		a + b < c;
		if (a > 0 && b > 0)	// 正数
		{
			if (a + b <= 0) // 溢出
			{
				cout << "Case #" << ++count << ": " << "true" << endl;
			}
			else
			{
				if (a + b > c)	// 输出
				{
					cout << "Case #" << ++count << ": " << "true" << endl;
				}
				else
				{
					cout << "Case #" << ++count << ": " << "false" << endl;
				}
			}
		}
		else if (a < 0 && b < 0)  // 负数
		{
			if (a + b >= 0) // 溢出
			{
				cout << "Case #" << ++count << ": " << "false" << endl;
			}
			else
			{
				if (a + b > c)	// 输出
				{
					cout << "Case #" << ++count << ": " << "true" << endl;
				}
				else
				{
					cout << "Case #" << ++count << ": " << "false" << endl;
				}
			}
		}
		else // 异号可以相加
		{
			if (temp > c)
			{
				cout << "Case #" << ++count << ": " << "true" << endl;
			}
			else
			{
				cout << "Case #" << ++count << ": " << "false" << endl;
			}
		}
}
下面就不能通过!!!
		
		long long int a, b, c, temp;
		cin >> a >> b >> c; // 输入a, b, c
		a + b < c;
		if (a > 0 && b > 0)	// 正数
		{
			if (a + b <= 0) // 溢出
			{
				cout << "Case #" << ++count << ": " << "true" << endl;
			}
			else
			{
				if (a + b > c)	// 输出
				{
					cout << "Case #" << ++count << ": " << "true" << endl;
				}
				else
				{
					cout << "Case #" << ++count << ": " << "false" << endl;
				}
			}
		}
		else if (a < 0 && b < 0)  // 负数
		{
			if (a + b >= 0) // 溢出
			{
				cout << "Case #" << ++count << ": " << "false" << endl;
			}
			else
			{
				if (a + b > c)	// 输出
				{
					cout << "Case #" << ++count << ": " << "true" << endl;
				}
				else
				{
					cout << "Case #" << ++count << ": " << "false" << endl;
				}
			}
		}
		else // 异号可以相加
		{
////////////////////////////////////////////////////////////////////////////////////////
			temp = a + b;
////////////////////////////////////////////////////////////////////////////////////////
			if (temp > c)
			{
				cout << "Case #" << ++count << ": " << "true" << endl;
			}
			else
			{
				cout << "Case #" << ++count << ": " << "false" << endl;
			}
		}
加载更多回复(7)

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧