本單元常犯錯誤總覽
| # | 錯誤描述 | 錯誤類型 | ✗ 錯誤寫法 | ✓ 正確寫法 |
|---|---|---|---|---|
| 1 | 用 float |
精度不足 WA | float x; |
double x; |
| 2 | 兩個整數相除想拿小數 | Wrong Answer | double x = a / b; |
double x = (double)a / b; |
| 3 | 事後才乘 1.0 |
Wrong Answer | a / b * 1.0 |
1.0 * a / b |
| 4 | 用預設輸出提交 | Wrong Answer | cout << ans;(科學記號/只剩 6 位) |
cout << fixed << setprecision(12) << ans; |
| 5 | setprecision 沒搭 fixed |
Wrong Answer | setprecision(3)(3 位有效數字) |
fixed << setprecision(3) |
| 6 | 用 == 比較浮點數 |
邏輯錯誤 | if (a == b) |
if (abs(a - b) < EPS) |
| 7 | 大整數用 double 儲存/讀入 | Wrong Answer | double x; 讀 10^{18} 等級輸入 |
long long x; |
| 8 | 用 e 記法寫大整數常數 | 差 1 的隱形錯 | long long n = 1e18 + 1; |
long long n = 1000000000000000001LL; |
| 9 | 用 pow 算整數次方 |
慢+不準 | pow(10, 15) |
迴圈連乘 |
| 10 | 把 (int) 當四捨五入 |
Wrong Answer | (int)(2.7) 得 2 |
(long long)round(2.7) |
| 11 | 負數的 (int) 與 floor 搞混 |
Wrong Answer | 以為 (int)-2.9 是 -3 |
(int) 向零;要向下用 floor |
| 12 | 浮點轉型超出整數範圍 | UB | (int)3e9 |
先確認範圍,用 long long |
| 13 | 上取整用浮點 ceil 硬算 |
誤差差 1 | ceil(1.0 * A / B) |
(A + B - 1) / B |
| 14 | sqrt 大數直接轉整數 |
差 1 的隱形錯 | (long long)sqrt(x) |
sqrtl 近似+整數修正(9.10) |