Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 기하학적 진행을 형성하는 정렬된 배열에서 모든 삼중항 찾기

<시간/>

고유한 양의 정수가 있는 정렬된 배열이 있다고 가정합니다. 적분 공통비로 기하학적 진행을 형성하는 모든 삼중항을 찾아야 합니다. 배열 요소가 [1, 2, 6, 10, 18, 54]이고, 삼중항이 (2, 6, 18) 및 (6, 18, 54)라고 가정하고 이들은 기하학적 진행을 형성하고 있습니다.

이를 해결하기 위해 두 번째 요소부터 시작하여 모든 요소를 ​​중간 요소로 고정하고 더 작은 요소와 큰 요소를 검색합니다. 중간 요소 arr[j]가 기하학적 진행의 중간이 되도록 하려면 이전 요소 arr[i] 및 arr[k]는 다음과 같습니다.

$$\frac{arr[j]}{arr[i]}=\frac{arr[k]}{arr[j]}=r𝑟$$

예시

#include<iostream>
using namespace std;
void getTriplets(int arr[], int n) {
   for (int j = 1; j < n - 1; j++) {
      int i = j - 1, k = j + 1;
      while (i >= 0 && k <= n - 1) {
         while (arr[j] % arr[i] == 0 && arr[k] % arr[j] == 0 && arr[j] / arr[i] == arr[k] / arr[j]) {
            cout << "("<< arr[i] << ", " << arr[j] << ", " << arr[k] << ")" << endl;
               k++;
               i--;
         }
         if(arr[j] % arr[i] == 0 && arr[k] % arr[j] == 0) {
            if(arr[j] / arr[i] < arr[k] / arr[j])
               i--;
         else
            k++;
         }else if (arr[j] % arr[i] == 0)
            k++;
         else
            i--;
      }
   }
}
int main() {
   int arr[] = {1, 2, 6, 10, 18, 54};
   int n = sizeof(arr) / sizeof(arr[0]);
   getTriplets(arr, n);
}

출력

(2, 6, 18)
(6, 18, 54)