Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ หาสามตัวเลข (Triplets) ในอาร์เรย์เรียงลำดับที่เป็นลำดับเรขาคณิต

สมมติเรามีอาร์เรย์ที่เรียงลำดับแล้วมีจำนวนเต็มบวกที่ไม่ซ้ำกัน เราต้องหาสามตัวเลข (triplets) ทั้งหมดที่เป็นลำดับเรขาคณิต (Geometric Progression) ด้วยอัตราส่วนร่วมเป็นจำนวนเต็ม สมมติสมาชิกอาร์เรย์คือ [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)