Dada una array arr[] de N enteros. Los números enteros representan todos los divisores de un número X excepto el 1 y el propio X. La tarea es encontrar el número X. Si no es posible tal elemento, imprima -1 .
Ejemplos:
Entrada: arr[] = {2, 10, 5, 4}
Salida: 20Entrada: arr[] = {2, 10, 5}
Salida: 20Entrada: arr[] = {2, 15}
Salida: -1
Enfoque: ordene los N divisores dados y el número X será el primer número * último número en la array ordenada. Verifique si la X contradice la declaración dada o no almacenando todos los divisores de X excepto 1 y X en otra array y si la array formada y la array dada no son las mismas, imprima -1 , de lo contrario imprima X.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function that returns X int findX(int a[], int n) { // Sort the given array sort(a, a + n); // Get the possible X int x = a[0] * a[n - 1]; // Container to store divisors vector<int> vec; // Find the divisors of x for (int i = 2; i * i <= x; i++) { // Check if divisor if (x % i == 0) { vec.push_back(i); if ((x / i) != i) vec.push_back(x / i); } } // sort the vec because a is sorted // and we have to compare all the elements sort(vec.begin(), vec.end()); // if size of both vectors is not same // then we are sure that both vectors // can't be equal if (vec.size() != n) return -1; else { // Check if a and vec have // same elements in them int i = 0; for (auto it : vec) { if (a[i++] != it) return -1; } } return x; } // Driver code int main() { int a[] = { 2, 5, 4, 10 }; int n = sizeof(a) / sizeof(a[0]); // Function call cout << findX(a, n); return 0; }
Java
// Java implementation of the approach import java.util.*; class GFG { // Function that returns X static int findX(int a[], int n) { // Sort the given array Arrays.sort(a); // Get the possible X int x = a[0] * a[n - 1]; // Container to store divisors Vector<Integer> vec = new Vector<Integer>(); // Find the divisors of x for (int i = 2; i * i <= x; i++) { // Check if divisor if (x % i == 0) { vec.add(i); if ((x / i) != i) vec.add(x / i); } } // sort the vec because a is sorted // and we have to compare all the elements Collections.sort(vec); // if size of both vectors is not same // then we are sure that both vectors // can't be equal if (vec.size() != n) return -1; else { // Check if a and vec have // same elements in them int i = 0; for (int it : vec) { if (a[i++] != it) return -1; } } return x; } // Driver code public static void main(String[] args) { int a[] = { 2, 5, 4, 10 }; int n = a.length; // Function call System.out.print(findX(a, n)); } } // This code is contributed by 29AjayKumar
Python3
# Python3 implementation of the approach # Function that returns X import math def findX(list, int): # Sort the given array list.sort() # Get the possible X x = list[0]*list[int-1] # Container to store divisors vec = [] # Find the divisors of x i = 2 while(i * i <= x): # Check if divisor if(x % i == 0): vec.append(i) if ((x//i) != i): vec.append(x//i) i += 1 # sort the vec because a is sorted # and we have to compare all the elements vec.sort() # if size of both vectors is not same # then we are sure that both vectors # can't be equal if(len(vec) != int): return -1 else: # Check if a and vec have # same elements in them j = 0 for it in range(int): if(a[j] != vec[it]): return -1 else: j += 1 return x # Driver code a = [2, 5, 4, 10] n = len(a) # Function call print(findX(a, n))
C#
// C# implementation of the approach using System; using System.Collections.Generic; class GFG { // Function that returns X static int findX(int[] a, int n) { // Sort the given array Array.Sort(a); // Get the possible X int x = a[0] * a[n - 1]; // Container to store divisors List<int> vec = new List<int>(); // Find the divisors of a number for (int i = 2; i * i <= x; i++) { // Check if divisor if (x % i == 0) { vec.Add(i); if ((x / i) != i) vec.Add(x / i); } } // sort the vec because a is sorted // and we have to compare all the elements vec.Sort(); // if size of both vectors is not same // then we are sure that both vectors // can't be equal if (vec.Count != n) { return -1; } else { // Check if a and vec have // same elements in them int i = 0; foreach(int it in vec) { if (a[i++] != it) return -1; } } return x; } // Driver code public static void Main(String[] args) { int[] a = { 2, 5, 4, 10 }; int n = a.Length; // Function call Console.Write(findX(a, n)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript implementation of the approach // Function that returns X function findX(a, n) { // Sort the given array a.sort((x,y) => x - y); // Get the possible X let x = a[0] * a[n - 1]; // Container to store divisors let vec = []; // Find the divisors of x for (let i = 2; i * i <= x; i++) { // Check if divisor if (x % i == 0) { vec.push(i); if (parseInt(x / i) != i) vec.push(parseInt(x / i)); } } // sort the vec because a is sorted // and we have to compare all the elements vec.sort((x,y) => x - y); // if size of both vectors is not same // then we are sure that both vectors // can't be equal if (vec.length != n) return -1; else { // Check if a and vec have // same elements in them let i = 0; for (let j = 0; j < vec.length; j++) { if (a[i++] != vec[j]) return -1; } } return x; } // Driver code let a = [ 2, 5, 4, 10 ]; let n = a.length; // Function call document.write(findX(a, n)); </script>
20
Complejidad de tiempo: O (nlogn)
Espacio auxiliar: O(sqrt(n))