📌  相关文章
📜  从给定的斜边和面积中找到直角三角形的所有边|套装1

📅  最后修改于: 2021-05-06 09:35:32             🧑  作者: Mango

给定直角三角形的斜边和面积,获取其底边和高度,如果不可能有给定斜边和面积的三角形,则无法打印。
例子:

Input  : hypotenuse = 5,    area = 6
Output : base = 3, height = 4

Input : hypotenuse = 5, area = 7 
Output : No triangle possible with above specification.

斜边

我们可以使用直角三角形的属性来解决此问题,具体如下:

A right angle triangle with fixed hypotenuse attains
maximum area, when it is isosceles i.e. both height
and base becomes equal so if hypotenuse if H, then 
by pythagorean theorem,
Base2 + Height2 = H2

For maximum area both base and height should be equal, 
b2 + b2 = H2
b = sqrt(H2/2)

Above is the length of base at which triangle attains
maximum area, given area must be less than this maximum
area, otherwise no such triangle will possible.  

现在,如果给定的面积小于此最大面积,我们可以对碱基的长度进行二进制搜索,因为增加的碱基会增加面积,这是一个单调递增的函数,可以轻松地应用二进制搜索。
在下面的代码中,编写了一种方法来获取直角三角形的面积,回想一下,对于直角三角形,面积为½* base * height,可以使用勾股定理从底和斜边计算出高度和高度。
下面是上述方法的实现:

C++
// C++ program to get right angle triangle, given
// hypotenuse and area of triangle
#include 
using namespace std;
   
//  limit for float comparison
#define eps 1e-6
   
// Utility method to get area of right angle triangle,
// given base and hypotenuse
double getArea(double base, double hypotenuse)
{
    double height = sqrt(hypotenuse*hypotenuse - base*base);
    return 0.5 * base * height;
}
   
// Prints base and height of triangle using hypotenuse
// and area information
void printRightAngleTriangle(int hypotenuse, int area)
{
    int hsquare = hypotenuse * hypotenuse;
   
    // maximum area will be obtained when base and height
    // are equal (= sqrt(h*h/2))
    double sideForMaxArea = sqrt(hsquare / 2.0);
    double maxArea = getArea(sideForMaxArea, hypotenuse);
   
    // if given area itself is larger than maxArea then no
    // solution is possible
    if (area > maxArea)
    {
        cout << "Not possiblen";
        return;
    }
   
    double low = 0.0;
    double high = sideForMaxArea;
    double base;
   
    // binary search for base
    while (abs(high - low) > eps)
    {
        base = (low + high) / 2.0;
        if (getArea(base, hypotenuse) >= area)
            high = base;
        else
            low = base;
    }
   
    // get height by pythagorean rule
    double height = sqrt(hsquare - base*base);
    cout << base << " " << height << endl;
}
   
// Driver code to test above methods
int main()
{
    int hypotenuse = 5;
    int area = 6;
   
    printRightAngleTriangle(hypotenuse, area);
    return 0;
}


Java
// Java program to get right angle triangle, given
// hypotenuse and area of triangle
public class GFG {
 
// limit for float comparison
    final static double eps = (double) 1e-6;
 
// Utility method to get area of right angle triangle,
// given base and hypotenuse
    static double getArea(double base, double hypotenuse) {
        double height = Math.sqrt(hypotenuse * hypotenuse - base * base);
        return 0.5 * base * height;
    }
 
// Prints base and height of triangle using hypotenuse
// and area information
    static void printRightAngleTriangle(int hypotenuse, int area) {
        int hsquare = hypotenuse * hypotenuse;
 
        // maximum area will be obtained when base and height
        // are equal (= sqrt(h*h/2))
        double sideForMaxArea = Math.sqrt(hsquare / 2.0);
        double maxArea = getArea(sideForMaxArea, hypotenuse);
 
        // if given area itself is larger than maxArea then no
        // solution is possible
        if (area > maxArea) {
            System.out.print("Not possible");
            return;
        }
 
        double low = 0.0;
        double high = sideForMaxArea;
        double base = 0;
 
        // binary search for base
        while (Math.abs(high - low) > eps) {
            base = (low + high) / 2.0;
            if (getArea(base, hypotenuse) >= area) {
                high = base;
            } else {
                low = base;
            }
        }
 
        // get height by pythagorean rule
        double height = Math.sqrt(hsquare - base * base);
        System.out.println(Math.round(base) + " " + Math.round(height));
    }
 
// Driver code to test above methods
    static public void main(String[] args) {
        int hypotenuse = 5;
        int area = 6;
 
        printRightAngleTriangle(hypotenuse, area);
    }
}
 
// This code is contributed by 29AjayKumar


Python3
# Python 3 program to get right angle triangle, given
# hypotenuse and area of triangle
 
# limit for float comparison
# define eps 1e-6
import math
 
# Utility method to get area of right angle triangle,
# given base and hypotenuse
def getArea(base, hypotenuse):
    height = math.sqrt(hypotenuse*hypotenuse - base*base);
    return 0.5 * base * height
 
# Prints base and height of triangle using hypotenuse
# and area information
def printRightAngleTriangle(hypotenuse, area):
    hsquare = hypotenuse * hypotenuse
 
    # maximum area will be obtained when base and height
    # are equal (= sqrt(h*h/2))
    sideForMaxArea = math.sqrt(hsquare / 2.0)
    maxArea = getArea(sideForMaxArea, hypotenuse)
 
    # if given area itself is larger than maxArea then no
    # solution is possible
    if (area > maxArea):
        print("Not possiblen")
        return
     
    low = 0.0
    high = sideForMaxArea
     
    # binary search for base
    while (abs(high - low) > 1e-6):
        base = (low + high) / 2.0
        if (getArea(base, hypotenuse) >= area):
            high =base
        else:
            low = base
     
    # get height by pythagorean rule
    height = math.ceil(math.sqrt(hsquare - base*base))
    base = math.floor(base)
    print(base,height)
 
# Driver code to test above methods
if __name__ == '__main__':
    hypotenuse = 5
    area = 6
 
    printRightAngleTriangle(hypotenuse, area)
 
# This code is contributed by
# Surendra_Gangwar


C#
// C# program to get right angle triangle, given
// hypotenuse and area of triangle
 
using System;
public class GFG{
 
 
// limit for float comparison
     static double eps = (double) 1e-6;
 
// Utility method to get area of right angle triangle,
// given base and hypotenuse
    static double getArea(double base1, double hypotenuse) {
        double height = Math.Sqrt(hypotenuse * hypotenuse - base1 * base1);
        return 0.5 * base1 * height;
    }
 
// Prints base and height of triangle using hypotenuse
// and area information
    static void printRightAngleTriangle(int hypotenuse, int area) {
        int hsquare = hypotenuse * hypotenuse;
 
        // maximum area will be obtained when base and height
        // are equal (= sqrt(h*h/2))
        double sideForMaxArea = Math.Sqrt(hsquare / 2.0);
        double maxArea = getArea(sideForMaxArea, hypotenuse);
 
        // if given area itself is larger than maxArea then no
        // solution is possible
        if (area > maxArea) {
            Console.Write("Not possible");
            return;
        }
 
        double low = 0.0;
        double high = sideForMaxArea;
        double base1 = 0;
 
        // binary search for base
        while (Math.Abs(high - low) > eps) {
            base1 = (low + high) / 2.0;
            if (getArea(base1, hypotenuse) >= area) {
                high = base1;
            } else {
                low = base1;
            }
        }
 
        // get height by pythagorean rule
        double height = Math.Sqrt(hsquare - base1 * base1);
        Console.WriteLine(Math.Round(base1) + " " + Math.Round(height));
    }
 
// Driver code to test above methods
    static public void Main() {
        int hypotenuse = 5;
        int area = 6;
 
        printRightAngleTriangle(hypotenuse, area);
    }
}
 
// This code is contributed by 29AjayKumar


PHP
 $maxArea)
    {
        echo "Not possiblen";
        return;
    }
 
    $low = 0.0;
    $high = $sideForMaxArea;
    $base;
 
    // binary search for base
    while (abs($high - $low) > $eps)
    {
        $base = ($low + $high) / 2.0;
        if (getArea($base, $hypotenuse) >= $area)
            $high = $base;
        else
            $low = $base;
    }
 
    // get height by pythagorean rule
    $height = sqrt($hsquare - $base * $base);
        echo (ceil($base)) ," ",
             (floor($height)), "\n";
}
 
// Driver Code
$hypotenuse = 5;
$area = 6;
 
printRightAngleTriangle($hypotenuse, $area);
 
// This code is contributed by Sachin
?>


Javascript


输出:

3 4