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)