Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 직각삼각형의 나머지 두 변과 세 각도 구하기

이 문제에서는 직각삼각형의 한 변을 나타내는 정수 a가 주어집니다. 우리가 해야 할 일은 이 변 a를 포함하는 직각삼각형이 성립할 수 있는지 확인하고, 가능하다면 나머지 두 변과 세 내각의 크기를 구하는 것입니다.

문제 이해를 위한 예시

입력

a = 5

출력

변 : 5, 12, 13
각도 : 67.38°, 22.62°, 90°

설명

세 변은 피타고라스 정리를 만족합니다. 즉, 52 + 122 = 132 입니다. 그리고 이 변들을 이용해 각도를 구할 수 있습니다. 역사인 함수를 사용하면 Sin-1(5/13) ≈ 22.62°이고, 나머지 예각은 90° − 22.62° = 67.38°가 됩니다.

해결 접근 방법

가장 기본적인 해결 방법은 피타고라스 정리를 활용하는 것입니다. 직각삼각형의 세 변은 다음 관계식을 항상 만족합니다.

a2 + b2 = c2

여기서 a와 b는 직각을 이루는 두 밑변(빗변이 아닌 변)이고, c는 빗변(hypotenuse)입니다. 이 공식을 활용하면 주어진 값 a만으로 나머지 두 변 b와 c를 계산할 수 있으며, a의 홀짝 여부에 따라 공식이 달라집니다.

경우 1 : a가 짝수인 경우

b = (a2 / 4) − 1
c = (a2 / 4) + 1

경우 2 : a가 홀수인 경우

b = (a2 − 1) / 2
c = (a2 + 1) / 2

단, a = 1 또는 a = 2일 때는 위 공식으로 유효한 자연수 변을 만들 수 없으므로 직각삼각형이 성립하지 않는다고 판단해야 합니다.

각도 구하기

세 변의 길이를 알면 코사인 법칙을 이용해 각 내각의 코사인 값을 구할 수 있습니다.

cos(A) = (b2 + c2 − a2) / 2bc
cos(B) = (a2 + c2 − b2) / 2ac
cos(C) = (a2 + b2 − c2) / 2ab

여기서 C는 빗변 c와 마주보는 각으로 항상 90°가 됩니다. 따라서 실제 코드에서는 acos() 함수로 A와 B만 계산하면 됩니다.

C++ 구현 예제

#include <bits/stdc++.h>
#include <cmath>
using namespace std;
#define PI 3.1415926535

void printAngles(int a, int b, int c) {
    double x = (double)a;
    double y = (double)b;
    double z = (double)c;
    double A = (((double)(acos(( (y*y) + (z*z) - (x*x) ) / (2*y*z))))* 180 / PI);
    double B = ((double)(acos(( (x*x) + (z*z) - (y*y) ) / (2*x*z)))* 180 / PI);
    cout<<"Angles: A = "<<A<<", B = "<<B<<", C = 90";
}

void printOtherSides(int n) {
    int b,c;
    if (n & 1) {
        if (n == 1)
            cout << -1 << endl;
        else{
            b = (n*n-1)/2;
            c = (n*n+1)/2;
        }
    } else {
        if (n == 2)
            cout << -1 << endl;
        else {
            b = n*n/4-1;
            c = n*n/4+1;
        }
    }
    cout<<"Sides : a = "<<n<<", b = "<<b<<", c = "<<c<<endl;
    printAngles(n,b,c);
}

int main() {
    int a = 5;
    printOtherSides(a);
    return 0;
}

실행 결과

Sides : a = 5, b = 12, c = 13
Angles: A = 22.6199, B = 67.3801, C = 90

정리

이 문제는 피타고라스 정리와 코사인 법칙이라는 두 가지 수학적 원리만 알고 있으면 쉽게 해결할 수 있습니다. 주어진 변 a의 홀짝 여부에 따라 적절한 공식으로 나머지 두 변을 먼저 구하고, 이후 삼각함수의 역함수인 acos()를 사용해 각도를 계산하면 됩니다. 시간 복잡도는 상수 연산만 수행하므로 O(1)로 매우 효율적입니다.