Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm các số gốc từ GCD của mọi cặp trong C++

Khái niệm

Cho mảng array[] chứa GCD của mọi cặp có thể của một mảng khác. Tìm các số gốc dùng để tính mảng GCD.

Ví dụ 1

Đầu vào: array[] = {6, 1, 1, 13}

Đầu ra: 13 6

gcd(13, 13) = 13
gcd(13, 6) = 1
gcd(6, 13) = 1
gcd(6, 6) = 6

Ví dụ 2

Đầu vào: arr[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 8, 11, 13, 3, 3}

Đầu ra: 13 11 8 6 6

Phương pháp

  • Sắp xếp mảng giảm dần.
  • Phần tử lớn nhất luôn là một số gốc. Lưu lại và xóa khỏi mảng.
  • Tính GCD của phần tử vừa lấy với các phần tử hiện tại từ lớn đến nhỏ, xóa giá trị GCD khỏi mảng.

Ví dụ

#include <bits/stdc++.h>
using namespace std;

void printArr(int array[], int n1) {
    for (int i = 0; i < n1; i++)
        cout << array[i] << " ";
}

void findNumbers(int array[], int n1) {
    sort(array, array + n1, greater<int>());
    int freq1[array[0] + 1] = {0};
    for (int i = 0; i < n1; i++)
        freq1[array[i]]++;
    int size1 = sqrt(n1);
    int brr1[size1] = {0}, x1, l1 = 0;
    for (int i = 0; i < n1; i++) {
        if (freq1[array[i]] > 0) {
            brr1[l1] = array[i];
            freq1[brr1[l1]]--;
            l1++;
            for (int j = 0; j < l1; j++) {
                if (i != j) {
                    x1 = __gcd(array[i], brr1[j]);
                    freq1[x1] -= 2;
                }
            }
        }
    }
    printArr(brr1, size1);
}

int main() {
    int array[] = {6, 1, 1, 13};
    int n1 = sizeof(array) / sizeof(array[0]);
    findNumbers(array, n1);
    return 0;
}

Đầu ra

13 6