C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++を使用して、直角三角形を形成する斜辺と面積の可能なペアの数を見つけます


この記事では、C++で直角三角形を形成する斜辺と面積の可能なペアの数を解決する方法を説明します。

斜辺と面積(H、A)のすべての可能なペアの数を決定して、Hを斜辺、Aを面積とする直角三角形を形成する必要があります。

この例では-

x=直角三角形の底

y=直角三角形の高さ

H=直角三角形の斜辺

直角三角形の面積を知っています

A =(x * y)/ 2

または

4 * A 2 =(x * y) 2 ……(1)

また、私たちは知っています

x 2 + y 2 =H 2 ……(2)

(1)と(2)を解く

4 * A 2 =x 2 (H 2 -x 2

2次方程式をx2で解き、D(判別式)> =0(xが存在する場合)

を入力します。

H2> =4 * A (直角三角形が存在するための条件)

これが例です-

Input : array H[ ] = { 3, 6, 8 } : A[ ] = { 2, 31, 12 }
Output : 4
Explanation : possible pairs of Hypotenuse and Area ( H, A ) are ( 3, 2 ), ( 6, 2 ), ( 8, 2 ) and ( 8, 12 ).

Input : array H[ ] = { 2, 5, 9 } : A[ ] = { 3, 11, 7 }
Output : 4
Explanation : possible pairs of Hypotenuse and Area ( H, A ) are possible pairs of Hypotenuse and Area ( H, A ) are ( 5, 3 ), ( 9, 3 ), ( 9, 11 ) and ( 9, 7 ).
>

解決策を見つけるためのアプローチ

次に、2つの異なる方法を使用して、特定のタスクを実行します-

ブルートフォースアプローチ

この単純なアプローチでは、斜辺と面積(H、A)の可能なすべてのペアを見つけ、それらが条件 h2> =4 * Aを満たしているかどうかを確認します。 かどうか、そしてこの条件を満たすすべてのペアが見つかったとカウントします。

#include <iostream>
using namespace std;
int main(){
    int H[ ] = { 2,5,9}; // array of hypotenuse
    int s1 = sizeof(H)/sizeof(H[0]);
    int A[ ] = { 3, 11, 7};// array of area
    int s2 = sizeof(A)/sizeof(A[0]);
    int count = 0;// initialising count to 0
    // finding all possible pairs
    for (int i = 0; i < s1; i++) {
        for (int j = 0; j < s2; j++) {
            // checking whether current pair satisfies the condition
            if (H[i] * H[i] >= 4 * A[j]){
                count++;

            }
        }
    }
    cout << "Number of possible pairs of ( H, A ): " << count ;
    return 0;
}

出力

Number of possible pairs of ( H, A ): 4

説明

このコードでは、カウント変数を使用して方程式を満たすペアのカウントを維持し、ネストされたループを使用して(H、A)ペアを生成します。このコードの時間計算量はO(n2)であり、効率的なアプローチではありません。 2番目のアプローチを理解しましょう。

効率的なアプローチ

このアプローチでは、最初に両方の配列を昇順で並べ替え、次に斜辺の長さを見つけて、 H 2 をチェックする際の最大領域を見つけます。> 4 * A

#include <bits/stdc++.h>
using namespace std;
int main (){
    int H[] = { 2, 5, 9 };
    int s1 = sizeof (H) / sizeof (H[0]);
    int A[] = {  3, 11, 7 };
    int s2 = sizeof (A) / sizeof (A[0]);
    int count = 0;
    // Sorting both the arrays
    sort (H, H + s1);
    sort (A, A + s2);
    int temp = -1;
    for (int i = 0; i < s1; i++){
        // Applying binary search for
        // every Hypotenuse Length
        int flag1 = 0;
        int flag2 = s2 - 1;
        while (flag1 <= flag2){
            int mid = flag1 + (flag2 - flag1) / 2;
            if ((H[i] * H[i]) >= (4 * A[mid])){
                temp = mid;
                flag1 = mid + 1;
            }
            else{
                flag2 = mid - 1;
            }
        }
        if (temp != -1){// Check if we get any possible area
            count += temp + 1;
        }
    }
    cout << "Number of possible pairs of (H, A): " << count;
    return 0;
}

出力

Number of possible pairs of ( H, A ): 4

上記のコードの説明

このコードでは、最初に両方の配列を昇順で並べ替えてから、最大面積を見つけるためにバイナリ検索を使用して可能なすべての長さをチェックしています。

最大面積が面積A[]の配列のインデックス3にあるとすると、インデックス3未満のすべての面積も方程式を満たし、3つの可能なペアを形成できます。

結論

この記事では、問題を解決して、直角三角形を作成するために使用される斜辺と面積のペアの数を見つけました。時間計算量がO(n 2 であるブルートフォースアプローチを適用しました )、および時間計算量がO(s1 log(s2))である効率的なアプローチ。この記事がお役に立てば幸いです。


  1. C ++を使用して、指定されたポイントから可能な四辺形の数を見つけます

    四辺形は、ユークリッド平面幾何学で4つの頂点と4つのエッジを持つポリゴンを形成します。名前4-gonなど。四辺形の他の名前に含まれ、正方形、表示スタイルなどとしても知られています。 この記事では、与えられた点から可能な四辺形の数を見つけるためのアプローチを説明します。この問題では、デカルト平面に提供された4つの点(x、y)を使用して作成できる四辺形の数を調べる必要があります。だからここに与えられた問題の例があります- Input : A( -2, 8 ), B( -2, 0 ), C( 6, -1 ), D( 0, 8 ) Output : 1 Explanation : One quadr

  2. C++を使用してサッカーの五角形と六角形の数を見つける

    ご存知のように、五角形と六角形はサッカーの重要な部分です。これらの形状は、完全な球形を形成するためのパズルのように組み合わされます。ですから、ここにサッカーがあり、六角形と五角形を見つける必要があります。 問題を簡単に解決するためにオイラー標数を使用します。オイラー標数は、位相空間の特定の形状または構造を記述するために機能する数値です。したがって、サッカーの五角形と六角形の数を計算するために使用できます。 オイラー標数- chi(S) −比表面積Sの整数 F −顔 G −グラフ V −頂点 E −エッジはSに埋め込まれています。 V - E + F