使用C++查詢構成直角三角形的斜邊和麵積的可能對數


在本文中,我們將解釋如何用C++解決直角三角形的斜邊和麵積的可能對數問題。

我們需要確定所有可能的斜邊和麵積對 (H, A) 的數量,這些對可以構成一個直角三角形,其中H為斜邊,A為面積。

在這個例子中:

         x = 直角三角形的底邊

         y = 直角三角形的高

         H = 直角三角形的斜邊

我們知道直角三角形的面積為:

A = (x * y) / 2

或者

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

我們也知道

x2 + y2 = H2 …… (2)

解方程 (1) & (2)

4 * A2 = x2 (H2 - x2)

解關於 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 ).

尋找解決方案的方法

現在我們將使用兩種不同的方法來執行給定的任務:

暴力搜尋法

在這個簡單的方法中,我們找到斜邊和麵積的所有可能對 (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),這並非一種高效的方法。讓我們瞭解第二種方法。

高效方法

在這種方法中,我們首先將兩個陣列按升序排序,然後我們找到任何斜邊長度以在檢查 H2 > 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(n2),以及高效方法,其時間複雜度為 O(s1 log(s2))。希望本文對您有所幫助。

更新於:2021年11月24日

151 次檢視

啟動您的職業生涯

完成課程後獲得認證

開始
廣告