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/4] 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/4] 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 + " "); - } - } } From 62272673060c937e288ca663e4add8df4e2e5bf0 Mon Sep 17 00:00:00 2001 From: Atul Sisodiya <56028094+AtulSisodiya@users.noreply.github.com> Date: Wed, 16 Oct 2024 22:31:49 +0530 Subject: [PATCH 3/4] Create EgyptianFractionTest.java Test cases --- .../greedyalgorithms/EgyptianFractionTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java diff --git a/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java b/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java new file mode 100644 index 000000000000..951c3a5de08c --- /dev/null +++ b/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java @@ -0,0 +1,15 @@ +package com.thealgorithms.greedyalgorithms; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; + +public class EgyptianFractionTest { + @Test + public void testGetEgyptianFraction() { + EgyptianFraction ef = new EgyptianFraction(); + List result = ef.getEgyptianFraction(5, 6); + assertEquals(List.of("1/2", "1/3"), result); + } +} From e5b8c5cb137b00a0e637c3c19b7b39b947250cf2 Mon Sep 17 00:00:00 2001 From: Atul Sisodiya <56028094+AtulSisodiya@users.noreply.github.com> Date: Wed, 16 Oct 2024 22:45:37 +0530 Subject: [PATCH 4/4] Update EgyptianFractionTest.java Adding egyptian fraction in greedy algorithm --- .../EgyptianFractionTest.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java b/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java index 951c3a5de08c..9f46ffc21384 100644 --- a/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java +++ b/src/test/java/com/thealgorithms/greedyalgorithms/EgyptianFractionTest.java @@ -1,15 +1,40 @@ package com.thealgorithms.greedyalgorithms; -import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; import java.util.List; public class EgyptianFractionTest { + EgyptianFraction ef = new EgyptianFraction(); + @Test - public void testGetEgyptianFraction() { - EgyptianFraction ef = new EgyptianFraction(); + public void testGetEgyptianFraction_NormalCase() { List result = ef.getEgyptianFraction(5, 6); assertEquals(List.of("1/2", "1/3"), result); } + + @Test + public void testGetEgyptianFraction_SimpleFraction() { + List result = ef.getEgyptianFraction(1, 2); + assertEquals(List.of("1/2"), result); + } + + @Test + public void testGetEgyptianFraction_WholeNumber() { + List result = ef.getEgyptianFraction(2, 1); + assertEquals(List.of("1/1", "1/2", "1/3", "1/6"), result); // Example output + } + + @Test + public void testGetEgyptianFraction_OneOverOne() { + List result = ef.getEgyptianFraction(1, 1); + assertEquals(List.of("1/1"), result); + } + + @Test + public void testGetEgyptianFraction_OneOverThree() { + List result = ef.getEgyptianFraction(1, 3); + assertEquals(List.of("1/3"), result); + } }