|
@@ -0,0 +1,64 @@
|
|
|
+# Some egyptian fractions
|
|
|
+
|
|
|
+Given a rational number n
|
|
|
+
|
|
|
+n >= 0, with denominator strictly positive
|
|
|
+
|
|
|
+- as a string (example: "2/3" in Ruby, Python, Clojure, JS, CS, Go) or as two
|
|
|
+ strings (example: "2" "3" in Haskell, Java, CSharp, C++, Swift)
|
|
|
+- or as a rational or decimal number (example: 3/4, 0.67 in R)
|
|
|
+
|
|
|
+decompose this number as a sum of rationals with numerators equal to one and
|
|
|
+without repetitions (2/3 = 1/2 + 1/6 is correct but not 2/3 = 1/3 + 1/3, 1/3 is
|
|
|
+repeated).
|
|
|
+
|
|
|
+The algorithm must be "greedy", so at each stage the new rational obtained in
|
|
|
+the decomposition must have a denominator as small as possible. In this manner
|
|
|
+the sum of a few fractions in the decomposition gives a rather good approximation
|
|
|
+of the rational to decompose.
|
|
|
+
|
|
|
+2/3 = 1/3 + 1/3 doesn't fit because of the repetition but also because the first
|
|
|
+1/3 has a denominator bigger than the one in 1/2 in the decomposition
|
|
|
+2/3 = 1/2 + 1/6.
|
|
|
+
|
|
|
+## Example:
|
|
|
+
|
|
|
+(You can see other examples in "Sample Tests:")
|
|
|
+
|
|
|
+`decompose("21/23")` or `"21" "23"` or `21/23` should return
|
|
|
+
|
|
|
+ ["1/2", "1/3", "1/13", "1/359", "1/644046"] in Ruby, Python, Clojure, JS, CS, Haskell, Go
|
|
|
+
|
|
|
+ "[1/2, 1/3, 1/13, 1/359, 1/644046]" in Java, CSharp, C++
|
|
|
+
|
|
|
+ "1/2,1/3,1/13,1/359,1/644046" in C, Swift, R
|
|
|
+
|
|
|
+## Notes
|
|
|
+
|
|
|
+1) The decomposition of 21/23 as
|
|
|
+
|
|
|
+ 21/23 = 1/2 + 1/3 + 1/13 + 1/598 + 1/897
|
|
|
+
|
|
|
+is exact but don't fulfill our requirement because 598 is bigger than 359. Same for
|
|
|
+
|
|
|
+ 21/23 = 1/2 + 1/3 + 1/23 + 1/46 + 1/69 (23 is bigger than 13)
|
|
|
+ or
|
|
|
+ 21/23 = 1/2 + 1/3 + 1/15 + 1/110 + 1/253 (15 is bigger than 13).
|
|
|
+
|
|
|
+2) The rational given to decompose could be greater than one or equal to one, in
|
|
|
+ which case the first "fraction" will be an integer (with an implicit
|
|
|
+ denominator of 1).
|
|
|
+
|
|
|
+3) If the numerator parses to zero the function "decompose" returns [] (or "".
|
|
|
+
|
|
|
+4) The number could also be a decimal which can be expressed as a rational.
|
|
|
+
|
|
|
+### examples:
|
|
|
+
|
|
|
+`0.6` in Ruby, Python, Clojure,JS, CS, Julia, Go
|
|
|
+
|
|
|
+`"66" "100"` in Haskell, Java, CSharp, C++, C, Swift, Scala, Kotlin
|
|
|
+
|
|
|
+`0.67` in R.
|
|
|
+
|
|
|
+**Ref**: http://en.wikipedia.org/wiki/Egyptian_fraction
|