Find A and B from list of divisors
Last Updated :
21 Jun, 2022
Given an array arr[] which consists of all the divisors of two integers A and B (along with A, B, and 1). The task is to find A and B from the given array.
Note: If a number is a divisor of both A and B then it will be present twice in the array.
Examples:
Input: arr[] = {1, 2, 4, 8, 16, 1, 2, 3, 6}
Output: A = 16, B = 6
1, 2, 4, 8 and 16 are the divisors of 16
1, 2, 3 and 6 are the divisors of 6
Input: arr[] = {1, 2, 4, 8, 16, 1, 2, 4}
Output: A = 16, B = 4
Approach: From the given array, as all the elements are divisors of either A or B then it is compulsory that the largest element of the array will be either A or B. For simplicity take it as A. Now, there are two cases which is applicable for an element to be B:
- B can be the largest element which is not a divisor of A.
- B can be the largest element smaller than A whose frequency is 2.
In order to find the value of A and B, sort the array. Print largest element as A and then the largest element which is either not a divisor of A or having frequency 2 will be B.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void printNumbers( int arr[], int n)
{
sort(arr, arr + n);
int A = arr[n - 1], B = -1;
for ( int i = n - 2; i >= 0; i--) {
if (A % arr[i] != 0) {
B = arr[i];
break ;
}
if (i - 1 >= 0 && arr[i] == arr[i - 1]) {
B = arr[i];
break ;
}
}
cout << "A = " << A << ", B = " << B;
}
int main()
{
int arr[] = { 1, 2, 4, 8, 16, 1, 2, 4 };
int n = sizeof (arr) / sizeof (arr[0]);
printNumbers(arr, n);
return 0;
}
|
Java
import java.util.*;
class GfG {
static void printNumbers( int arr[], int n)
{
Arrays.sort(arr);
int A = arr[n - 1 ], B = - 1 ;
for ( int i = n - 2 ; i >= 0 ; i--) {
if (A % arr[i] != 0 ) {
B = arr[i];
break ;
}
if (i - 1 >= 0 && arr[i] == arr[i - 1 ]) {
B = arr[i];
break ;
}
}
System.out.print( "A = " + A + ", B = " + B);
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 4 , 8 , 16 , 1 , 2 , 4 };
int n = arr.length;
printNumbers(arr, n);
}
}
|
Python3
def printNumbers(arr, n):
arr.sort()
A, B = arr[n - 1 ], - 1
for i in range (n - 2 , - 1 , - 1 ):
if A % arr[i] ! = 0 :
B = arr[i]
break
if i - 1 > = 0 and arr[i] = = arr[i - 1 ]:
B = arr[i]
break
print ( "A =" , A, ", B =" , B)
if __name__ = = "__main__" :
arr = [ 1 , 2 , 4 , 8 , 16 , 1 , 2 , 4 ]
n = len (arr)
printNumbers(arr, n)
|
C#
using System.Collections;
using System;
class GfG
{
static void printNumbers( int []arr, int n)
{
Array.Sort(arr);
int A = arr[n - 1], B = -1;
for ( int i = n - 2; i >= 0; i--)
{
if (A % arr[i] != 0)
{
B = arr[i];
break ;
}
if (i - 1 >= 0 && arr[i] == arr[i - 1])
{
B = arr[i];
break ;
}
}
Console.WriteLine( "A = " + A + ", B = " + B);
}
public static void Main()
{
int []arr = { 1, 2, 4, 8, 16, 1, 2, 4 };
int n = arr.Length;
printNumbers(arr, n);
}
}
|
PHP
<?php
function printNumbers( $arr , $n )
{
sort( $arr );
$A = $arr [ $n - 1]; $B = -1;
for ( $i = $n - 2; $i >= 0; $i --)
{
if ( $A % $arr [ $i ] != 0)
{
$B = $arr [ $i ];
break ;
}
if ( $i - 1 >= 0 && $arr [ $i ] == $arr [ $i - 1])
{
$B = $arr [ $i ];
break ;
}
}
echo ( "A = " . $A . ", B = " . $B );
}
$arr = array ( 1, 2, 4, 8, 16, 1, 2, 4 );
$n = sizeof( $arr );
printNumbers( $arr , $n );
|
Javascript
<script>
function printNumbers(arr, n)
{
arr.sort((a,b)=>{ return a-b;});
var A = arr[n - 1], B = -1;
for ( var i = n - 2; i >= 0; i--) {
if ((A % arr[i]) != 0) {
B = arr[i];
break ;
}
if (i - 1 >= 0 && arr[i] == arr[i - 1]) {
B = arr[i];
break ;
}
}
document.write( "A = " + A + ", B = " + B);
}
var arr = [ 1, 2, 4, 8, 16, 1, 2, 4 ];
var n = arr.length;
printNumbers(arr, n);
</script>
|
Time Complexity: O(nlog(n))
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...