From d1efd19fc9fddd2d3ffe61c0a7e3fb79d9c2e8bd Mon Sep 17 00:00:00 2001 From: Atul Sisodiya <56028094+AtulSisodiya@users.noreply.github.com> Date: Wed, 16 Oct 2024 22:09:09 +0530 Subject: [PATCH 1/2] Create EgyptianFraction.java Adding Greedy Algorithm for Egyptian Fraction Problem --- .../greedyalgorithms/EgyptianFraction.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java diff --git a/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java b/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java new file mode 100644 index 000000000000..7cb5023cc8f7 --- /dev/null +++ b/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java @@ -0,0 +1,52 @@ +package com.thealgorithms.greedyalgorithms; +import java.util.ArrayList; +import java.util.List; +// Problem Link: https://en.wikipedia.org/wiki/Greedy_algorithm_for_Egyptian_fractions + +public class EgyptianFraction { + // Function to decompose a fraction into a sum of unit fractions + public static List getEgyptianFraction(int numerator, int denominator) { + List result = new ArrayList<>(); + + while (numerator != 0) { + // Find the smallest unit fraction that can be subtracted + if (denominator % numerator == 0) { + result.add("1/" + (denominator / numerator)); + break; + } + int x = denominator / numerator + 1; + + result.add("1/" + x); + // Update numerator and denominator for the next iteration + numerator = numerator * x - denominator; + denominator = denominator * x; + + // Reduce the fraction by dividing numerator and denominator by their gcd + int gcd = gcd(numerator, denominator); + numerator /= gcd; + denominator /= gcd; + } + + return result; + } + + private static int gcd(int a, int b) { + if (b == 0) + return a; + return gcd(b, a % b); + } + + public static void main(String[] args) { + int numerator = 5; + int denominator = 6; + + List egyptianFractions = getEgyptianFraction(numerator, denominator); + + System.out.println("Egyptian Fraction representation of " + numerator + "/" + denominator + " is:"); + for (String frac : egyptianFractions) { + System.out.print(frac + " "); + } + } +} + + From b373fd023fa8d512e3db91424f5dfcfcb2257d2e Mon Sep 17 00:00:00 2001 From: Atul Sisodiya <56028094+AtulSisodiya@users.noreply.github.com> Date: Wed, 16 Oct 2024 22:16:07 +0530 Subject: [PATCH 2/2] Update EgyptianFraction.java Egyptian Fraction Greedy Algorithm --- .../greedyalgorithms/EgyptianFraction.java | 43 +++++-------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java b/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java index 7cb5023cc8f7..893097c3669d 100644 --- a/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java +++ b/src/main/java/com/thealgorithms/greedyalgorithms/EgyptianFraction.java @@ -4,49 +4,28 @@ // Problem Link: https://en.wikipedia.org/wiki/Greedy_algorithm_for_Egyptian_fractions public class EgyptianFraction { - // Function to decompose a fraction into a sum of unit fractions - public static List getEgyptianFraction(int numerator, int denominator) { - List result = new ArrayList<>(); + + public List getEgyptianFraction(int numerator, int denominator) { + List fractions = new ArrayList<>(); + // Loop until the numerator becomes zero while (numerator != 0) { - // Find the smallest unit fraction that can be subtracted - if (denominator % numerator == 0) { - result.add("1/" + (denominator / numerator)); - break; - } - int x = denominator / numerator + 1; + // Find the smallest unit fraction + int x = (denominator + numerator - 1) / numerator; // Ceiling of (denominator / numerator) + fractions.add("1/" + x); - result.add("1/" + x); - // Update numerator and denominator for the next iteration + // Update the numerator and denominator numerator = numerator * x - denominator; denominator = denominator * x; - - // Reduce the fraction by dividing numerator and denominator by their gcd - int gcd = gcd(numerator, denominator); - numerator /= gcd; - denominator /= gcd; } - return result; + return fractions; } - private static int gcd(int a, int b) { - if (b == 0) - return a; + private int gcd(int a, int b) { + if (b == 0) return a; // Compact if statement for readability return gcd(b, a % b); } - - public static void main(String[] args) { - int numerator = 5; - int denominator = 6; - - List egyptianFractions = getEgyptianFraction(numerator, denominator); - - System.out.println("Egyptian Fraction representation of " + numerator + "/" + denominator + " is:"); - for (String frac : egyptianFractions) { - System.out.print(frac + " "); - } - } }