变态的ACM题

Sep 19, 2012 08:10:33 PM

http://acm.nyist.net/JudgeOnline/problem.php?pid=477

链接地址是南阳理工学院的一道语言入门题,我在作出如下判断后进行提交

if(c == (a + b)){
printf("Yes\n");
}
else{
printf("No\n");
}
结果是错误的
 
此题关键是实数在计算机内存储形式问题,如:1在计算机内部形式是0.99999·····

所以会产生小数点后精度的一点点偏差,导致程序出错!
 
正确的结果是:
#include <stdio.h>
int main(){
	int num = 0;
	double a = 0, b = 0, c = 0;
	scanf("%d", &num);
	
	while(num--){
		scanf("%lf %lf %lf", &a, &b, &c);
		if((a <= 10000.0) && (a >= -10000.0) 
           && (b <= 10000.0) && (b >= -10000.0)
           && (c <= 20000.0) && (c >= -20000.0))
		{
			if(((a + b) - c <= 0.00001) && ((a + b) - c >= -0.00001)){
				printf("Yes\n");
			}
			else{
				printf("No\n");
			}
		}
	}	
	return 0;
}