HCF of array of fractions (or rational numbers)
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++
// CPP program to find HCF of array of // rational numbers (fractions). #include <iostream> using namespace std; // hcf of two number int gcd( int a, int b) { if (a % b == 0) return b; else return (gcd(b, a % b)); } // find hcf of numerator series 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 hcf of numerator return (ans); } // find lcm of denominator series int findLcm( int ** arr, int size) { // ans contains LCM of arr[0][1], ..arr[i][1] int ans = arr[0][1]; for ( int i = 1; i < size; i++) ans = (((arr[i][1] * ans)) / (gcd(arr[i][1], ans))); // return lcm of denominator return (ans); } // Core Function int * hcfOfFraction( int ** arr, int size) { // found hcf of numerator int hcf_of_num = findHcf(arr, size); // found lcm of denominator 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 return (result); } // Main function int main() { int size = 4; int ** arr = new int *[size]; // Initialize the every row // with size 2 (1 for numerator // and 2 for denominator) 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; // function for calculate the result int * result = hcfOfFraction(arr, size); // print the result cout << result[0] << ", " << result[1] << endl; return 0; } |
Java
// Java program to find HCF of array of // rational numbers (fractions). class GFG { // hcf of two number static int gcd( int a, int b) { if (a % b == 0 ) return b; else return (gcd(b, a % b)); } // find hcf of numerator series 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 hcf of numerator return (ans); } // find lcm of denominator series static int findLcm( int [][] arr, int size) { // ans contains LCM of arr[0][1], ..arr[i][1] int ans = arr[ 0 ][ 1 ]; for ( int i = 1 ; i < size; i++) ans = (((arr[i][ 1 ] * ans)) / (gcd(arr[i][ 1 ], ans))); // return lcm of denominator return (ans); } // Core Function static int [] hcfOfFraction( int [][] arr, int size) { // found hcf of numerator int hcf_of_num = findHcf(arr, size); // found lcm of denominator 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 return (result); } // Driver code public static void main(String[] args) { int size = 4 ; int [][] arr = new int [size][size]; // Initialize the every row // with size 2 (1 for numerator // and 2 for denominator) 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 ; // function for calculate the result int [] result = hcfOfFraction(arr, size); // print the result System.out.println(result[ 0 ] + ", " + result[ 1 ]); } } /* This code contributed by PrinciRaj1992 */ |
Python3
# Python 3 program to find HCF of array of from math import gcd # find hcf of numerator series def findHcf(arr, size): ans = arr[ 0 ][ 0 ] for i in range ( 1 , size, 1 ): ans = gcd(ans, arr[i][ 0 ]) # return hcf of numerator return (ans) # find lcm of denominator series def findLcm(arr, size): # ans contains LCM of arr[0][1], ..arr[i][1] ans = arr[ 0 ][ 1 ] for i in range ( 1 , size, 1 ): ans = int ((((arr[i][ 1 ] * ans)) / (gcd(arr[i][ 1 ], ans)))) # return lcm of denominator return (ans) # Core Function def hcfOfFraction(arr, size): # found hcf of numerator hcf_of_num = findHcf(arr, size) # found lcm of denominator 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 return (result) # Driver Code if __name__ = = '__main__' : size = 4 arr = [ 0 for i in range (size)] # Initialize the every row # with size 2 (1 for numerator # and 2 for denominator) 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 # function for calculate the result result = hcfOfFraction(arr, size) # print the result print (result[ 0 ], "," , result[ 1 ]) # This code is contributed by # Surendra_Gangwar |
C#
// C# program to find HCF of array of // rational numbers (fractions). using System; class GFG { // hcf of two number static int gcd( int a, int b) { if (a % b == 0) return b; else return (gcd(b, a % b)); } // find hcf of numerator series 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 hcf of numerator return (ans); } // find lcm of denominator series static int findLcm( int [,] arr, int size) { // ans contains LCM of arr[0,1], ..arr[i,1] int ans = arr[0,1]; for ( int i = 1; i < size; i++) ans = (((arr[i, 1] * ans)) / (gcd(arr[i, 1], ans))); // return lcm of denominator return (ans); } // Core Function static int [] hcfOfFraction( int [,] arr, int size) { // found hcf of numerator int hcf_of_num = findHcf(arr, size); // found lcm of denominator 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 return (result); } // Driver code public static void Main(String[] args) { int size = 4; int [,] arr = new int [size, size]; // Initialize the every row // with size 2 (1 for numerator // and 2 for denominator) 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; // function for calculate the result int [] result = hcfOfFraction(arr, size); // print the result Console.WriteLine(result[0] + ", " + result[1]); } } // This code has been contributed by 29AjayKumar |
Javascript
<script> // Javascript program to find HCF of array of // rational numbers (fractions). // hcf of two number function gcd(a,b) { if (a % b == 0) return b; else return (gcd(b, a % b)); } // find hcf of numerator series function findHcf(arr,size) { let ans = arr[0][0]; for (let i = 1; i < size; i++) ans = gcd(ans, arr[i][0]); // return hcf of numerator return (ans); } // find lcm of denominator series function findLcm(arr,size) { // ans contains LCM of arr[0][1], ..arr[i][1] 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 lcm of denominator return (ans); } // Core Function function hcfOfFraction(arr,size) { // found hcf of numerator let hcf_of_num = findHcf(arr, size); // found lcm of denominator 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 return (result); } // Driver code let size = 4; let arr = new Array(size); // Initialize the every row // with size 2 (1 for numerator // and 2 for denominator) 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; // function for calculate the result let result = hcfOfFraction(arr, size); // print the result document.write(result[0] + ", " + result[1]+ "<br>" ); // This code is contributed by rag2127 </script> |
Output
3, 1400
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.
This article is contributed by Aarti_Rathi.
Please Login to comment...