Given a string s containing two fractions a/b and c/d, compare them and return the greater. If they are equal, then return "equal".
Note: The string s contains "a/b, c/d"(fractions are separated by comma(,) & space( )).
Examples :
Input: s = "5/6, 11/45"
Output: 5/6
Explanation: 5/6=0.8333 and 11/45=0.2444, So 5/6 is a greater fraction.
Input: s= "8/1, 8/1"
Output: equal
Explanation: We can see that both the fractions are same, so we'll return a string "equal".
Table of Content
[Naive Approach] Using Floating Point Division - O(1) Time O(1) Space
The idea is to convert both fractions into decimal values and compare them.
#include <iostream>
using namespace std;
// Function to compare two fractions
string compareFrac(string &s)
{
// Finding position of comma
int commaPos = s.find(',');
// Extracting both fractions
string s1 = s.substr(0, commaPos);
string s2 = s.substr(commaPos + 2);
// Finding position of '/'
int slash1 = s1.find('/');
int slash2 = s2.find('/');
// Extracting numerator and denominator
int a = stoi(s1.substr(0, slash1));
int b = stoi(s1.substr(slash1 + 1));
int c = stoi(s2.substr(0, slash2));
int d = stoi(s2.substr(slash2 + 1));
// Converting fractions into decimal values
double val1 = (double)a / b;
double val2 = (double)c / d;
// Comparing decimal values
if (val1 > val2)
return s1;
if (val2 > val1)
return s2;
return "equal";
}
// Driver Code
int main()
{
string s = "5/6, 11/45";
cout << compareFrac(s);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Function to compare two fractions
char* compareFrac(char* s)
{
// Finding position of comma
char* commaPos = strchr(s, ',');
// Extracting both fractions
char s1[50];
char s2[50];
strncpy(s1, s, commaPos - s);
s1[commaPos - s] = '\0';
strcpy(s2, commaPos + 2);
// Variables for numerator and denominator
int a, b, c, d;
// Extracting numerator and denominator
sscanf(s1, "%d/%d", &a, &b);
sscanf(s2, "%d/%d", &c, &d);
// Converting fractions into decimal values
double val1 = (double)a / b;
double val2 = (double)c / d;
// Comparing decimal values
if (val1 > val2)
return strdup(s1);
if (val2 > val1)
return strdup(s2);
return strdup("equal");
}
// Driver Code
int main()
{
char s[] = "5/6, 11/45";
printf("%s", compareFrac(s));
return 0;
}
import java.util.*;
public class GfG {
// Function to compare two fractions
public static String compareFrac(String s) {
// Finding position of comma
int commaPos = s.indexOf(',');
// Extracting both fractions
String s1 = s.substring(0, commaPos);
String s2 = s.substring(commaPos + 2);
// Finding position of '/'
int slash1 = s1.indexOf('/');
int slash2 = s2.indexOf('/');
// Extracting numerator and denominator
int a = Integer.parseInt(s1.substring(0, slash1));
int b = Integer.parseInt(s1.substring(slash1 + 1));
int c = Integer.parseInt(s2.substring(0, slash2));
int d = Integer.parseInt(s2.substring(slash2 + 1));
// Converting fractions into decimal values
double val1 = (double)a / b;
double val2 = (double)c / d;
// Comparing decimal values
if (val1 > val2)
return s1;
if (val2 > val1)
return s2;
return "equal";
}
// Driver Code
public static void main(String[] args) {
String s = "5/6, 11/45";
System.out.println(compareFrac(s));
}
}
def compareFrac(s):
# Finding position of comma
commaPos = s.find(',')
# Extracting both fractions
s1 = s[:commaPos]
s2 = s[commaPos + 2:]
# Finding position of '/'
slash1 = s1.find('/')
slash2 = s2.find('/')
# Extracting numerator and denominator
a = int(s1[:slash1])
b = int(s1[slash1 + 1:])
c = int(s2[:slash2])
d = int(s2[slash2 + 1:])
# Converting fractions into decimal values
val1 = a / b
val2 = c / d
# Comparing decimal values
if val1 > val2:
return s1
if val2 > val1:
return s2
return "equal"
# Driver Code
if __name__ == "__main__":
s = "5/6, 11/45"
print(compareFrac(s))
using System;
class GfG {
// Function to compare two fractions
public static string compareFrac(string s) {
// Finding position of comma
int commaPos = s.IndexOf(',');
// Extracting both fractions
string s1 = s.Substring(0, commaPos);
string s2 = s.Substring(commaPos + 2);
// Finding position of '/'
int slash1 = s1.IndexOf('/');
int slash2 = s2.IndexOf('/');
// Extracting numerator and denominator
int a = int.Parse(s1.Substring(0, slash1));
int b = int.Parse(s1.Substring(slash1 + 1));
int c = int.Parse(s2.Substring(0, slash2));
int d = int.Parse(s2.Substring(slash2 + 1));
// Converting fractions into decimal values
double val1 = (double)a / b;
double val2 = (double)c / d;
// Comparing decimal values
if (val1 > val2)
return s1;
if (val2 > val1)
return s2;
return "equal";
}
// Driver Code
public static void Main() {
string s = "5/6, 11/45";
Console.WriteLine(compareFrac(s));
}
}
// Function to compare two fractions
function compareFrac(s) {
// Finding position of comma
let commaPos = s.indexOf(',');
// Extracting both fractions
let s1 = s.substring(0, commaPos);
let s2 = s.substring(commaPos + 2);
// Finding position of '/'
let slash1 = s1.indexOf('/');
let slash2 = s2.indexOf('/');
// Extracting numerator and denominator
let a = parseInt(s1.substring(0, slash1));
let b = parseInt(s1.substring(slash1 + 1));
let c = parseInt(s2.substring(0, slash2));
let d = parseInt(s2.substring(slash2 + 1));
// Converting fractions into decimal values
let val1 = a / b;
let val2 = c / d;
// Comparing decimal values
if (val1 > val2)
return s1;
if (val2 > val1)
return s2;
return 'equal';
}
// Driver Code
let s = '5/6, 11/45';
console.log(compareFrac(s));
Output
5/6
Time Complexity: O(1)
Auxiliary Space: O(1)
[Expected Approach] Using Cross Multiplication - O(1) Time O(1) Space
The idea is to compare fractions using cross multiplication instead of division.
For two fractions
a/bandc/d, compare a * d and b * c
- If
a * d > b * c, then the first fraction is greater.- If
a * d < b * c, then the second fraction is greater.- Otherwise, both fractions are equal.
#include <iostream>
using namespace std;
// Function to compare two fractions
string compareFrac(string &s)
{
// Finding position of comma
int commaPos = s.find(',');
// Extracting both fractions
string s1 = s.substr(0, commaPos);
string s2 = s.substr(commaPos + 2);
// Finding position of '/'
int slash1 = s1.find('/');
int slash2 = s2.find('/');
// Extracting numerator and denominator
int a = stoi(s1.substr(0, slash1));
int b = stoi(s1.substr(slash1 + 1));
int c = stoi(s2.substr(0, slash2));
int d = stoi(s2.substr(slash2 + 1));
// Cross multiplication
long long left = 1LL * a * d;
long long right = 1LL * b * c;
// Comparing fractions
if (left > right)
return s1;
if (right > left)
return s2;
return "equal";
}
// Driver Code
int main()
{
string s = "5/6, 11/45";
cout << compareFrac(s);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Function to compare two fractions
char* compareFrac(char* s)
{
// Finding position of comma
int commaPos = strchr(s, ',') - s;
// Extracting both fractions
char s1[100];
char s2[100];
strncpy(s1, s, commaPos);
s1[commaPos] = '\0';
strcpy(s2, s + commaPos + 2);
// Variables for numerator and denominator
int a, b, c, d;
// Extracting numerator and denominator
sscanf(s1, "%d/%d", &a, &b);
sscanf(s2, "%d/%d", &c, &d);
// Cross multiplication
long long left = 1LL * a * d;
long long right = 1LL * b * c;
// Comparing fractions
if (left > right)
return strdup(s1);
if (right > left)
return strdup(s2);
return strdup("equal");
}
// Driver Code
int main()
{
char s[] = "5/6, 11/45";
printf("%s", compareFrac(s));
return 0;
}
public class GfG {
// Function to compare two fractions
public static String compareFrac(String s) {
// Finding position of comma
int commaPos = s.indexOf(',');
// Extracting both fractions
String s1 = s.substring(0, commaPos);
String s2 = s.substring(commaPos + 2);
// Finding position of '/'
int slash1 = s1.indexOf('/');
int slash2 = s2.indexOf('/');
// Extracting numerator and denominator
int a = Integer.parseInt(s1.substring(0, slash1));
int b = Integer.parseInt(s1.substring(slash1 + 1));
int c = Integer.parseInt(s2.substring(0, slash2));
int d = Integer.parseInt(s2.substring(slash2 + 1));
// Cross multiplication
long left = 1L * a * d;
long right = 1L * b * c;
// Comparing fractions
if (left > right)
return s1;
if (right > left)
return s2;
return "equal";
}
// Driver Code
public static void main(String[] args) {
String s = "5/6, 11/45";
System.out.println(compareFrac(s));
}
}
def compareFrac(s):
# Finding position of comma
commaPos = s.find(',')
# Extracting both fractions
s1 = s[:commaPos]
s2 = s[commaPos + 2:]
# Finding position of '/'
slash1 = s1.find('/')
slash2 = s2.find('/')
# Extracting numerator and denominator
a = int(s1[:slash1])
b = int(s1[slash1 + 1:])
c = int(s2[:slash2])
d = int(s2[slash2 + 1:])
# Cross multiplication
left = a * d
right = b * c
# Comparing fractions
if left > right:
return s1
if right > left:
return s2
return 'equal'
# Driver Code
if __name__ == "__main__":
s = "5/6, 11/45"
print(compareFrac(s))
using System;
class GfG {
// Function to compare two fractions
public static string compareFrac(string s) {
// Finding position of comma
int commaPos = s.IndexOf(',');
// Extracting both fractions
string s1 = s.Substring(0, commaPos);
string s2 = s.Substring(commaPos + 2);
// Finding position of '/'
int slash1 = s1.IndexOf('/');
int slash2 = s2.IndexOf('/');
// Extracting numerator and denominator
int a = int.Parse(s1.Substring(0, slash1));
int b = int.Parse(s1.Substring(slash1 + 1));
int c = int.Parse(s2.Substring(0, slash2));
int d = int.Parse(s2.Substring(slash2 + 1));
// Cross multiplication
long left = 1L * a * d;
long right = 1L * b * c;
// Comparing fractions
if (left > right)
return s1;
if (right > left)
return s2;
return "equal";
}
// Driver Code
public static void Main() {
string s = "5/6, 11/45";
Console.WriteLine(compareFrac(s));
}
}
function compareFrac(s) {
// Finding position of comma
let commaPos = s.indexOf(',');
// Extracting both fractions
let s1 = s.substring(0, commaPos);
let s2 = s.substring(commaPos + 2);
// Finding position of '/'
let slash1 = s1.indexOf('/');
let slash2 = s2.indexOf('/');
// Extracting numerator and denominator
let a = parseInt(s1.substring(0, slash1));
let b = parseInt(s1.substring(slash1 + 1));
let c = parseInt(s2.substring(0, slash2));
let d = parseInt(s2.substring(slash2 + 1));
// Cross multiplication
let left = BigInt(a) * BigInt(d);
let right = BigInt(b) * BigInt(c);
// Comparing fractions
if (left > right)
return s1;
if (right > left)
return s2;
return 'equal';
}
// Driver Code
let s = '5/6, 11/45';
console.log(compareFrac(s));
Output
5/6
Time Complexity: O(1)
Auxiliary Space: O(1)