輸入三邊長 a, b, c,判斷是否能構成直角三角形。輸入以 0 0 0 結束。
a + b > c && a + c > b && b + c > a
a² + b² = c² 或 a² + c² = b² 或 b² + c² = a²(任一邊為斜邊皆可能)
a > 0 && b > 0 && c > 0#includeint main() { int a, b, c; // 讀取至 EOF 或 0 0 0 while (scanf("%d %d %d", &a, &b, &c) == 3) { if (a == 0 && b == 0 && c == 0) break; // 1. 正邊長 + 三角形不等式 if (a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a) { // 2. 畢達哥拉斯定理 (用長整數防溢位) long long aa = 1LL * a * a; long long bb = 1LL * b * b; long long cc = 1LL * c * c; if (aa + bb == cc || aa + cc == bb || bb + cc == aa) { printf("right\n"); } else { printf("wrong\n"); } } else { printf("wrong\n"); // 不滿足三角形基本條件 } } return 0; }
| 細節 | 說明 |
|---|---|
| 溢位防護 | 邊長上限未給,int 平方可能溢位 (32767² > 2³¹)。用 long long (64 位) 計算平方。 |
| 輸入結束條件 | while (scanf(...) == 3) 處理 EOF;0 0 0 為題目指定終止,不輸出。 |
| 邊長順序不固定 | 斜邊可能是 a、b、c 任一,必須檢查三種組合。 |
| 退化三角形 | a+b==c 面積為 0,非三角形,直接 wrong。 |
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 3 4 5 | right | 經典 3-4-5 直角三角形 |
| 5 12 13 | right | 5-12-13 |
| 6 8 10 | right | 3-4-5 的 2 倍 |
| 1 1 1 | wrong | 正三角形,非直角 |
| 2 3 4 | wrong | 非直角 |
| 1 2 3 | wrong | 退化 (1+2=3) |
| 0 0 0 | (程式結束) | 終止輸入 |
若輸入為浮點數,直接比較 == 不可靠,需引入**容差 (epsilon)**:
#include#define EPS 1e-9 int is_right_double(double a, double b, double c) { if (a <= 0 || b <= 0 || c <= 0) return 0; if (a + b <= c || a + c <= b || b + c <= a) return 0; double aa = a*a, bb = b*b, cc = c*c; return (fabs(aa + bb - cc) < EPS) || (fabs(aa + cc - bb) < EPS) || (fabs(bb + cc - aa) < EPS); }
直角三角形判斷 = 三角形不等式 + 畢達哥拉斯定理。關鍵技巧:用 64 位整數防平方溢位、檢查三種斜邊可能、正確處理輸入終止條件。這是幾何計算類 OJ 題的基礎模板。