首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言幾何判斷:直角三角形檢測(埃及繩結原理)

     編輯:關於C語言

問題來源

經典 UVa / POJ 題目「Egypt」:輸入三邊長 a,b,c,判斷能否構成直角三角形。終止條件為 0 0 0。輸出 right 或 wrong。

核心判定邏輯

  1. 首先判斷能否構成三角形:a+b>c && a+c>b && b+c>a(且均 >0)。
  2. 再判斷勾股定理:a²+b²==c² || a²+c²==b² || b²+c²==a²。
  3. 整數運算無精度問題,直接比較即可。

原始代碼優化版

#include <stdio.h>

int main() {
    int a, b, c;
    while (scanf("%d %d %d", &a, &b, &c) == 3) {
        if (a == 0 && b == 0 && c == 0) break;
        // 簡單排序使 c 為最大邊,簡化判斷
        if (a > b) { int t=a; a=b; b=t; }
        if (b > c) { int t=b; b=c; c=t; }
        if (a > b) { int t=a; a=b; b=t; }
        // 現在 a <= b <= c
        if (a + b > c && a*a + b*b == c*c)
            puts("right");
        else
            puts("wrong");
    }
    return 0;
}

關鍵優化點

  • 排序後單一判斷:將最大邊固定為 c,只需檢查 a²+b²==c²,碼更簡潔。
  • 去除冗餘三角形判定:若 a²+b²==c² 且 a,b,c>0,必然滿足 a+b>c(證明:(a+b)² = a²+b²+2ab = c²+2ab > c² ⇒ a+b>c)。
  • 使用 puts:輸出固定字串更高效。

擴展:浮點數邊長判斷

若輸入為浮點數,需引入誤差閾值:

const double EPS = 1e-9;
if (fabs(a*a + b*b - c*c) < EPS) // 判定直角

並注意邊長為 0 或負數的非法輸入過濾。

歷史典故:埃及繩結

古埃及繩結師使用 12 節等分繩子拉成 3-4-5 三角形測量直角,此即勾股數最早應用。本題致敬該歷史。

Egypt 程式運行截圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved