Language C Debug Ⅰ
初學小白在各高校ACM Online Judge上刷題時,總會遇到這樣或那樣的問題,比如,全角半角,\n,==,&a,各類運算子結合性,1<=a<=3 …稻花香里說豐年,聽取W.A.聲一片!
- 有關資料型別和精度問題
example1.1:求圓柱的體積等,輸出結果和標準答案小數點后第二位有細微差別,WA如下:
#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如下
#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…因此,在判斷浮點數是否相等時,可以借鑒《高等數學》中對于“無限接近”的ξ來近似表示相等,修改如下:
#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);//注意拼寫和空格
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/188388.html
標籤:其他
