📜  分数(或有理数)数组的HCF

📅  最后修改于: 2021-05-04 09:58:13             🧑  作者: Mango

给定分数序列。查找给定分数系列的HCF。
例子:

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

方法:

C++
// CPP program to find HCF of array of 
// rational numbers (fractions).
#include 
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


输出:

3, 1400