Ratio of area of a rectangle with the rectangle inscribed in it

11 Jul, 2022
Given two rectangles, X with a ratio of length to width a:b and Y with a ratio of length to width c:d respectively. Both the rectangles can be resized as long as the ratio of sides remains the same. The task is to place the second rectangle inside the first rectangle such that at least 1 side is equal and that side overlaps of both the rectangles and find the ratio of (space occupied by a 2nd rectangle) : (space occupied by the first rectangle).Examples:  
Input: a = 1, b = 1, c = 3, d = 2
Output: 2:3
The dimensions can be 3X3 and 3X2.

Input: a = 4, b = 3, c = 2, d = 2
Output: 3:4
The dimensions can be 4X3 and 3X3
 
Approach: If we make one of the sides of rectangles equal then the required ratio would be the ratio of the other side. Consider 2 cases:  
a*d < b*c : We should make a and c equal.
b*c < a*d : We should make b and d equal.
Since multiplying both sides of a ratio does not change its value. First try to make a and c equal, it can be made equal to their lcm by multiplying (a:b) with lcm/a and (c:d) with lcm/c. After multiplication, the ratio of (b:d) will be the required answer. This ratio can be reduced by dividing b and d with gcd(b, d).Below is the implementation of the above approach:  
C++
Java
Python3
C#
PHP
Javascript
// C++ implementation of above approach#include <bits/stdc++.h>using namespace std; // Function to find the ratiovoid printRatio(int a, int b, int c, int d){    if (b * c > a * d) {        swap(c, d);        swap(a, b);    }     // LCM of numerators    int lcm = (a * c) / __gcd(a, c);     int x = lcm / a;    b *= x;     int y = lcm / c;    d *= y;     // Answer in reduced form    int k = __gcd(b, d);    b /= k;    d /= k;     cout << b << ":" << d;} // Driver codeint main(){    int a = 4, b = 3, c = 2, d = 2;     printRatio(a, b, c, d);     return 0;}
// Java implementation of above approach import java.io.*; class GFG {// Recursive function to return gcd of a and b    static int __gcd(int a, int b)    {        // Everything divides 0         if (a == 0)          return b;        if (b == 0)          return a;                // base case        if (a == b)            return a;                // a is greater        if (a > b)            return __gcd(a-b, b);        return __gcd(a, b-a);    }        // Function to find the ratio static void printRatio(int a, int b, int c, int d){    if (b * c > a * d) {        int temp = c;        c =d;        d =c;        temp =a;        a =b;        b=temp;         }     // LCM of numerators    int lcm = (a * c) / __gcd(a, c);     int x = lcm / a;    b *= x;     int y = lcm / c;    d *= y;     // Answer in reduced form    int k = __gcd(b, d);    b /= k;    d /= k;     System.out.print( b + ":" + d);}     // Driver code    public static void main (String[] args) {        int a = 4, b = 3, c = 2, d = 2;     printRatio(a, b, c, d);    }}   // This code is contributed by inder_verma..
import math# Python3 implementation of above approach # Function to find the ratiodef printRatio(a, b, c, d):    if (b * c > a * d):        swap(c, d)        swap(a, b)         # LCM of numerators    lcm = (a * c) / math.gcd(a, c)     x = lcm / a    b = int(b * x)     y = lcm / c    d = int(d * y)     # Answer in reduced form    k = math.gcd(b,d)    b =int(b / k)    d = int(d / k)     print(b,":",d) # Driver codeif __name__ == '__main__':    a = 4    b = 3    c = 2    d = 2     printRatio(a, b, c, d) # This code is contributed by# Surendra_Gangwar
// C# implementation of above approach using System; class GFG {// Recursive function to return gcd of a and b    static int __gcd(int a, int b)    {        // Everything divides 0        if (a == 0)        return b;        if (b == 0)        return a;                 // base case        if (a == b)            return a;                 // a is greater        if (a > b)            return __gcd(a-b, b);        return __gcd(a, b-a);    }      // Function to find the ratiostatic void printRatio(int a, int b, int c, int d){    if (b * c > a * d) {        int temp = c;        c =d;        d =c;        temp =a;        a =b;        b=temp;         }     // LCM of numerators    int lcm = (a * c) / __gcd(a, c);     int x = lcm / a;    b *= x;     int y = lcm / c;    d *= y;     // Answer in reduced form    int k = __gcd(b, d);    b /= k;    d /= k;     Console.WriteLine( b + ":" + d);} // Driver code     public static void Main () {        int a = 4, b = 3, c = 2, d = 2;     printRatio(a, b, c, d);    }} // This code is contributed by inder_verma..
<?php// PHP implementation of above approach // Recursive function to return// gcd of a and bfunction __gcd($a, $b){    // Everything divides 0    if ($a == 0)        return $b;    if ($b == 0)        return $a;         // base case    if ($a == $b)        return $a;         // a is greater    if ($a > $b)        return __gcd($a - $b, $b);    return __gcd($a, $b - $a);} // Function to find the ratiofunction printRatio($a, $b, $c, $d){    if ($b * $c > $a * $d)    {        $temp = $c;        $c = $d;        $d = $c;                 $temp = $a;        $a = $b;        $b = $temp;    }         // LCM of numerators    $lcm = ($a * $c) / __gcd($a, $c);         $x = $lcm / $a;    $b *= $x;         $y = $lcm / $c;    $d *= $y;         // Answer in reduced form    $k = __gcd($b, $d);    $b /= $k;    $d /= $k;         echo $b . ":" . $d;} // Driver code$a = 4; $b = 3; $c = 2; $d = 2; printRatio($a, $b, $c, $d); // This code is contributed// by Akanksha Rai?>
<script>// Javascript implementation of above approach // Recursive function to return // gcd of a and b function __gcd(a, b) {      // Everything divides 0     if (a == 0)         return b;     if (b == 0)         return a;            // base case     if (a == b)         return a;            // a is greater     if (a > b)         return __gcd(a - b,b);     return __gcd(a, b - a); }    // Function to find the ratiofunction printRatio(a, b, c, d){     if (b * c > a * d)     {        temp = c;        c = d;        d = c;                   temp = a;        a = b;        b = temp;    }     // LCM of numerators    let lcm = (a * c) / __gcd(a, c);     let x = lcm / a;    b *= x;     let y = lcm / c;    d *= y;     // Answer in reduced form    let k = __gcd(b, d);    b /= k;    d /= k;     document.write(b + ":" + d);} // Driver code     let a = 4, b = 3, c = 2, d = 2;    printRatio(a, b, c, d);  // This code is contributed by Manoj </script>
3:4
 
Time complexity: O(log(max(a,c))+log(max(b,d)))
Auxiliary Space: O(log(max(a,c))+log(max(b,d)))
inderDuMCA
SURENDRA_GANGWAR
Akanksha_Rai
mank1083
hasani
subhammahato348
area-volume-programs
Ratio and Proportion
Algorithms
Mathematical
Mathematical
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.