在C ++中每对从gcd()查找原始数字

概念

对于包含另一个数组的每个可能元素对的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