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

C++로 주어진 둘레를 만족하는 직각삼각형의 개수 구하기

이 문제에서는 삼각형의 둘레 P가 주어집니다. 둘레란 삼각형 세 변의 길이를 모두 더한 값입니다. 목표는 이 둘레와 동일한 둘레를 가지면서 만들 수 있는 직각삼각형의 총 개수를 찾는 것입니다.

삼각형의 세 변을 a, b, c라고 하면 다음 두 조건을 만족해야 합니다.

  • a + b + c = P (둘레 조건)
  • a² + b² = c² (피타고라스 정리, a, b, c의 어떤 조합에도 적용)

확인 방법은 a를 1부터 p/2까지, b를 a+1부터 p/3까지 순회하며 c = p − a − b (a + b + c = p)로 계산하는 것입니다.

모든 직각삼각형에 대해 피타고라스 정리를 적용하고, 또한 세 변이 실제 삼각형을 형성해야 한다는 조건, 즉 임의의 두 변의 합이 나머지 한 변보다 항상 커야 한다는 조건도 함께 검사합니다.

예시로 이해하기

입력 — 둘레 P = 12

출력 — 직각삼각형의 총 개수: 1

설명

a + b + c = P 와 a² + b² = c² (그리고 임의의 두 변의 합 > 나머지 변) 조건을 모두 만족하는 a, b, c의 유일한 조합은 4, 3, 5입니다.

4 + 3 + 5 = 12, 3×3 + 4×4 = 5×5 (9 + 16 = 25)이며, 3 + 4 > 5, 4 + 5 > 3, 3 + 5 > 4 도 모두 성립합니다.

입력 — 둘레 P = 10

출력 — 직각삼각형의 총 개수: 0

설명

a + b + c = P 와 a² + b² = c² 를 동시에 만족하는 a, b, c의 값은 존재하지 않습니다.

접근 방법

  • 주어진 둘레 값을 저장하는 정수 변수 perimeter를 사용합니다.
  • 함수 rightTriangles(int p)는 둘레를 입력받아 가능한 직각삼각형의 총 개수를 반환합니다.
  • 변수 count는 가능한 직각삼각형의 수를 저장하며, 초기값은 0입니다.
  • for 반복문으로 a를 1부터 p/2까지 순회합니다.
  • 중첩된 for 반복문으로 b를 a+1부터 p/3까지 순회합니다. (직각삼각형에서 두 변은 서로 같을 수 없습니다.)
  • c = p − a − b 로 계산한 후, 해당 a, b, c가 (a+b>c && b+c>a && a+c>b) 삼각형 성립 조건을 만족하는지 확인합니다.
  • 또한 피타고라스 정리 a*a + b*b == c*c 를 검사하여 참이면 count를 증가시킵니다.
  • 마지막으로 count에는 주어진 둘레로 만들 수 있는 직각삼각형의 개수가 저장되어 있으므로 이를 결과로 반환합니다.

참고 — 중복된 결과를 피하기 위해 피타고라스 정리는 a, b, c의 한 가지 조합에 대해서만 검사합니다.

예제 코드

#include <bits/stdc++.h>
using namespace std;
int rightTriangles(int p){
    int count = 0;
    int c=0;
    for( int a=1;a<p/2;a++){
        for(int b=1;b<p/3;b++){
            c=p-a-b;
            if( a+b>c && b+c>a && a+c>b) //삼각형 성립 조건
            {
                if( (a*a+b*b)==c*c ) //직각삼각형의 피타고라스 정리
                { ++count; }
            }
        }
    }
    return count;
}
int main(){
    int perimeter= 12;
    cout << "만들 수 있는 직각삼각형의 총 개수: "<<rightTriangles(perimeter);
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다.

만들 수 있는 직각삼각형의 총 개수: 1