给定直角三角形的斜边和面积,获取它的底边和高度,如果任何具有给定斜边和面积的三角形都不可能,则无法打印。
例子:
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
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。