对于包含另一个数组的每个可能元素对的GCD的给定array [],我们的任务是确定用于计算GCD数组的原始编号。
array[] = {6, 1, 1, 13}
输出结果
13 6 gcd(13, 13) = 13 gcd(13, 6) = 1 gcd(6, 13) = 1 gcd(6, 6) = 6
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}
输出结果
13 11 8 6 6
首先,以降序对数组进行排序。
最大的元素将始终是原始数字之一。保持该编号并将其从数组中删除。
从上一个元素开始计算上一个元素的GCD,将当前元素从最大元素开始计算,并丢弃给定数组中的GCD值。
// C++ implementation of the approach #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) { //计算GCD- x1 = __gcd(array[i], brr1[j]); //将GCD值减2- freq1[x1] -= 2; } } } } printArr(brr1, size1); } //驱动程式码 int main(){ /* int array[] = { 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}; */ int array[] = { 6, 1, 1, 13}; int n1 = sizeof(array) / sizeof(array[0]); findNumbers(array, n1); return 0; }
输出结果
13 6