Giả sử chúng ta có một mảng được sắp xếp với các số nguyên dương khác nhau. Chúng ta phải tìm tất cả các bộ ba, tạo thành cấp số nhân Hình học với tỷ lệ chung tích phân. Giả sử các phần tử của mảng là [1, 2, 6, 10, 18, 54], các phần tử bộ ba là (2, 6, 18) và (6, 18, 54), chúng tạo thành cấp số nhân hình học.
Để giải quyết vấn đề này, chúng ta sẽ bắt đầu từ phần tử thứ hai và sửa mọi phần tử là phần tử giữa, đồng thời tìm kiếm các phần tử nhỏ hơn và lớn hơn. Đối với phần tử giữa arr [j] là giữa của tiến trình hình học, phần tử trước đó arr [i] và arr [k] sẽ giống như
$$ \ frac {arr [j]} {arr [i]} =\ frac {arr [k]} {arr [j]} =r𝑟 $$
Ví dụ
#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); }
Đầu ra
(2, 6, 18) (6, 18, 54)