Language C Debug Ⅰ(UPDATING)

Language C Debug Ⅰ

初学小白在各高校ACM Online Judge上刷题时,总会遇到这样或那样的问题。好比,全角半角,\n,==,&a,各种运算符结合性,1<=a<=3 …稻花香里说丰年,听取W.A.声一片!spa

  1. 有关数据类型和精度问题

example1.1:求圆柱的体积等,输出结果和标准答案小数点后第二位有细微差异,WA以下:code

#include <stdio.h>
#include <math.h>

#define PI 3.14
#define C(r) 2 * PI * r
#define S(r) PI * r * r
#define S2(r) 4 * PI * r * r
#define Va(r) 4.0/3.0 * PI * r * r * r
#define Vb(r, h) PI * r * r * h

int main()
{ 
	float r , h;
	scanf("%f %f", &r, &h);
	printf("C1=%.2f\n", C(r));
	printf("Sa=%.2lf\n", S(r));
	printf("Sb=%.2f\n", S2(r));
	printf("Va=%.2f\n", Va(r));
	printf("Vb=%.2f\n", Vb(r, h));
	return 0;
}

这个涉及到精度问题,3.14在计算机中是不精确的表示。
注意float常量的写法(3.14为double类型 3.14f 为float类型)
或者,能够在下方强制转化 float(PI);

数学

example1.2:高速公路超速处罚,WA以下io

#include <stdio.h>

int main()
{ 
	float v,lim,x;
	while(scanf("%f%f",&v,&lim) != EOF)
	{ 
		x=(v-lim)/lim*100;
		if(v<lim*1.1)
		printf("OK\n");
		else if(v<lim*1.5)
		printf("Exceed %.0f%%. Ticket 200\n",x);
		else
		printf("Exceed %.0f%%. License Revoked\n",x);
	}
}
Sample Input Sample Output
65 60 OK √
110 100 Exceed 10%. Ticket 200 ×
200 120 Exceed 67%. License Revoked √

1.1在计算机中一样是不精确的表示,因此1.1*100多是110.000000000000014…所以,在判断浮点数是否相等时,能够借鉴《高等数学》中对于“无限接近”的ξ来近似表示相等。修改以下:table

#include <stdio.h>

int main()
{ 
	float v,lim,x;
	while(scanf("%f%f",&v,&lim) != EOF)
	{ 
		x=(v-lim)/lim*100;
		if(v-lim*1.1<-0.0000001)
		printf("OK\n");
		else if(v-lim*1.5<-0.0000001)
		printf("Exceed %.0f%%. Ticket 200\n",x);//注意%%
		else
		printf("Exceed %.0f%%. License Revoked\n",x);//注意拼写和空格
	}
}
相关文章
相关标签/搜索