Language C Debug Ⅰ
初學小白在各高校ACM Online Judge上刷題時,總會遇到這樣或那樣的問題。好比,全角半角,\n,==,&a,各種運算符結合性,1<=a<=3 …稻花香裏說豐年,聽取W.A.聲一片!spa
- 有關數據類型和精度問題
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);//注意拼寫和空格 } }