top1编程
← 返回题目
题解

判断直角三角形

1 条题解

  • 0
    @ 2026-8-5 21:17:14

    P4290 判断直角三角形(【入门】)

    解题思路

    三条线段要围成一个直角三角形,必须满足"两条短边的平方和等于长边的平方",这就是著名的勾股定理。题目很贴心,输入的三个数已经排好序:a≥b≥ca ≥ b ≥ c,所以最大的 aa 一定是斜边,bb 和 cc 就是两条直角边。

    我们只要验证 a×a==b×b+c×ca \times a == b \times b + c \times c 是否成立:

    • 成立:说明能构成直角三角形,面积就是两条直角边乘积的一半,即 b×c÷2b \times c \div 2;
    • 不成立:输出小写字母 no。

    举个例子:输入 5 4 3,52=255^2=25,42+32=16+9=254^2+3^2=16+9=25,两边相等,所以是直角三角形,面积 4×3÷2=64\times3\div2=6。

    边界情况:比如输入 3 2 1,32=93^2=9,而 22+12=52^2+1^2=5,不相等,输出 no。另外,直角三角形的两条整数直角边里一定有一条是偶数,所以 b×cb\times c 一定是偶数,用整数除法除以 2 不会丢掉小数部分。

    参考代码

    // 判断三条线段能否构成直角三角形,能则输出面积
    #include <iostream>
    using namespace std;
    
    int main() {
        int a, b, c;
        cin >> a >> b >> c;
        // 输入保证 a>=b>=c,所以 a 一定是斜边
        if (a * a == b * b + c * c) {
            // 面积 = 两条直角边相乘再除以2
            cout << b * c / 2 << endl;
        } else {
            cout << "no" << endl;
        }
        return 0;
    }
    

    复杂度分析

    程序只做了几次乘法和一次比较,无论三条线段多长,都只需要固定几步,所以时间复杂度是 O(1)O(1)。只用了 a、b、ca、b、c 三个变量,额外空间复杂度也是 O(1)O(1)。

    • 1