HCF of array of fractions (or rational numbers)
Last Updated :
02 Aug, 2022
Given a fraction series. Find the H.C.F of a given fraction series.
Examples:
Input : [{2, 5}, {8, 9}, {16, 81}, {10, 27}]
Output : 2, 405
Explanation : 2/405 is the largest number that
divides all 2/5, 8/9, 16/81 and 10/27.
Input : [{9, 10}, {12, 25}, {18, 35}, {21, 40}]
Output : 3, 1400
Approach:
Find the H.C.F of numerators.
Find the L.C.M of denominators.
Calculate fraction of H.C.F/L.C.M.
Reduce the fraction to Lowest Fraction.
Implementation:
C++
#include <iostream>
using namespace std;
int gcd( int a, int b)
{
if (a % b == 0)
return b;
else
return (gcd(b, a % b));
}
int findHcf( int ** arr, int size)
{
int ans = arr[0][0];
for ( int i = 1; i < size; i++)
ans = gcd(ans, arr[i][0]);
return (ans);
}
int findLcm( int ** arr, int size)
{
int ans = arr[0][1];
for ( int i = 1; i < size; i++)
ans = (((arr[i][1] * ans)) /
(gcd(arr[i][1], ans)));
return (ans);
}
int * hcfOfFraction( int ** arr, int size)
{
int hcf_of_num = findHcf(arr, size);
int lcm_of_deno = findLcm(arr, size);
int * result = new int [2];
result[0] = hcf_of_num;
result[1] = lcm_of_deno;
for ( int i = result[0] / 2; i > 1; i--)
{
if ((result[1] % i == 0) && (result[0] % i == 0))
{
result[1] /= i;
result[0] /= i;
}
}
return (result);
}
int main()
{
int size = 4;
int ** arr = new int *[size];
for ( int i = 0; i < size; i++)
arr[i] = new int [2];
arr[0][0] = 9;
arr[0][1] = 10;
arr[1][0] = 12;
arr[1][1] = 25;
arr[2][0] = 18;
arr[2][1] = 35;
arr[3][0] = 21;
arr[3][1] = 40;
int * result = hcfOfFraction(arr, size);
cout << result[0] << ", " << result[1] << endl;
return 0;
}
|
Java
class GFG
{
static int gcd( int a, int b)
{
if (a % b == 0 )
return b;
else
return (gcd(b, a % b));
}
static int findHcf( int [][]arr, int size)
{
int ans = arr[ 0 ][ 0 ];
for ( int i = 1 ; i < size; i++)
ans = gcd(ans, arr[i][ 0 ]);
return (ans);
}
static int findLcm( int [][] arr, int size)
{
int ans = arr[ 0 ][ 1 ];
for ( int i = 1 ; i < size; i++)
ans = (((arr[i][ 1 ] * ans)) /
(gcd(arr[i][ 1 ], ans)));
return (ans);
}
static int [] hcfOfFraction( int [][] arr, int size)
{
int hcf_of_num = findHcf(arr, size);
int lcm_of_deno = findLcm(arr, size);
int [] result = new int [ 2 ];
result[ 0 ] = hcf_of_num;
result[ 1 ] = lcm_of_deno;
for ( int i = result[ 0 ] / 2 ; i > 1 ; i--)
{
if ((result[ 1 ] % i == 0 ) && (result[ 0 ] % i == 0 ))
{
result[ 1 ] /= i;
result[ 0 ] /= i;
}
}
return (result);
}
public static void main(String[] args)
{
int size = 4 ;
int [][] arr = new int [size][size];
for ( int i = 0 ; i < size; i++)
arr[i] = new int [ 2 ];
arr[ 0 ][ 0 ] = 9 ;
arr[ 0 ][ 1 ] = 10 ;
arr[ 1 ][ 0 ] = 12 ;
arr[ 1 ][ 1 ] = 25 ;
arr[ 2 ][ 0 ] = 18 ;
arr[ 2 ][ 1 ] = 35 ;
arr[ 3 ][ 0 ] = 21 ;
arr[ 3 ][ 1 ] = 40 ;
int [] result = hcfOfFraction(arr, size);
System.out.println(result[ 0 ] + ", " + result[ 1 ]);
}
}
|
Python3
from math import gcd
def findHcf(arr, size):
ans = arr[ 0 ][ 0 ]
for i in range ( 1 , size, 1 ):
ans = gcd(ans, arr[i][ 0 ])
return (ans)
def findLcm(arr, size):
ans = arr[ 0 ][ 1 ]
for i in range ( 1 , size, 1 ):
ans = int ((((arr[i][ 1 ] * ans)) /
(gcd(arr[i][ 1 ], ans))))
return (ans)
def hcfOfFraction(arr, size):
hcf_of_num = findHcf(arr, size)
lcm_of_deno = findLcm(arr, size)
result = [ 0 for i in range ( 2 )]
result[ 0 ] = hcf_of_num
result[ 1 ] = lcm_of_deno
i = int (result[ 0 ] / 2 )
while (i > 1 ):
if ((result[ 1 ] % i = = 0 ) and
(result[ 0 ] % i = = 0 )):
result[ 1 ] = int (result[ 1 ] / i)
result[ 0 ] = (result[ 0 ] / i)
return (result)
if __name__ = = '__main__' :
size = 4
arr = [ 0 for i in range (size)]
for i in range (size):
arr[i] = [ 0 for i in range ( 2 )]
arr[ 0 ][ 0 ] = 9
arr[ 0 ][ 1 ] = 10
arr[ 1 ][ 0 ] = 12
arr[ 1 ][ 1 ] = 25
arr[ 2 ][ 0 ] = 18
arr[ 2 ][ 1 ] = 35
arr[ 3 ][ 0 ] = 21
arr[ 3 ][ 1 ] = 40
result = hcfOfFraction(arr, size)
print (result[ 0 ], "," , result[ 1 ])
|
C#
using System;
class GFG
{
static int gcd( int a, int b)
{
if (a % b == 0)
return b;
else
return (gcd(b, a % b));
}
static int findHcf( int [,]arr, int size)
{
int ans = arr[0, 0];
for ( int i = 1; i < size; i++)
ans = gcd(ans, arr[i, 0]);
return (ans);
}
static int findLcm( int [,] arr, int size)
{
int ans = arr[0,1];
for ( int i = 1; i < size; i++)
ans = (((arr[i, 1] * ans)) /
(gcd(arr[i, 1], ans)));
return (ans);
}
static int [] hcfOfFraction( int [,] arr, int size)
{
int hcf_of_num = findHcf(arr, size);
int lcm_of_deno = findLcm(arr, size);
int [] result = new int [2];
result[0] = hcf_of_num;
result[1] = lcm_of_deno;
for ( int i = result[0] / 2; i > 1; i--)
{
if ((result[1] % i == 0) && (result[0] % i == 0))
{
result[1] /= i;
result[0] /= i;
}
}
return (result);
}
public static void Main(String[] args)
{
int size = 4;
int [,] arr = new int [size, size];
arr[0, 0] = 9;
arr[0, 1] = 10;
arr[1, 0] = 12;
arr[1, 1] = 25;
arr[2, 0] = 18;
arr[2, 1] = 35;
arr[3, 0] = 21;
arr[3, 1] = 40;
int [] result = hcfOfFraction(arr, size);
Console.WriteLine(result[0] + ", " + result[1]);
}
}
|
Javascript
<script>
function gcd(a,b)
{
if (a % b == 0)
return b;
else
return (gcd(b, a % b));
}
function findHcf(arr,size)
{
let ans = arr[0][0];
for (let i = 1; i < size; i++)
ans = gcd(ans, arr[i][0]);
return (ans);
}
function findLcm(arr,size)
{
let ans = arr[0][1];
for (let i = 1; i < size; i++)
ans = Math.floor(((arr[i][1] * ans)) /
(gcd(arr[i][1], ans)));
return (ans);
}
function hcfOfFraction(arr,size)
{
let hcf_of_num = findHcf(arr, size);
let lcm_of_deno = findLcm(arr, size);
let result = new Array(2);
result[0] = hcf_of_num;
result[1] = lcm_of_deno;
for (let i = result[0] / 2; i > 1; i--)
{
if ((result[1] % i == 0) && (result[0] % i == 0))
{
result[1] /= i;
result[0] /= i;
}
}
return (result);
}
let size = 4;
let arr = new Array(size);
for (let i = 0; i < size; i++)
arr[i] = new Array(2);
arr[0][0] = 9;
arr[0][1] = 10;
arr[1][0] = 12;
arr[1][1] = 25;
arr[2][0] = 18;
arr[2][1] = 35;
arr[3][0] = 21;
arr[3][1] = 40;
let result = hcfOfFraction(arr, size);
document.write(result[0] + ", " + result[1]+ "<br>" );
</script>
|
Time Complexity: O(n log(a)) , where a is the maximum element in array
Auxiliary Space: O(log(a)), where a is the maximum element in array
Please suggest if someone has a better solution which is more efficient in terms of space and time.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...