How to know the repeating decimal in a fraction?
algorithm, c#, class
Solution
A very simple algorithm is this: implement long division. Record every intermediate division you do. As soon as you see a division identical to the one you've done before, you have what's being repeated.
Example: 7/13.
1. 13 goes into 7 0 times with remainder 7; bring down a 0.
2. 13 goes into 70 5 times with remainder 5; bring down a 0.
3. 13 goes into 50 3 times with remainder 11; bring down a 0.
4. 13 goes into 110 8 times with remainder 6; bring down a 0.
5. 13 goes into 60 4 times with remainder 8; bring down a 0.
6. 13 goes into 80 6 times with remainder 2; bring down a 0.
7. 13 goes into 20 1 time with remainder 7; bring down a 0.
8. We have already seen 13/70 on line 2; so lines 2-7 have the repeating part
The algorithm gives us 538461 as the repeating part. My calculator says 7/13 is 0.538461538. Looks right to me! All that remains are implementation details, or to find a better algorithm!
Problem
I already know when a fraction is repeating decimals. Here is the function. ``` public bool IsRepeatingDecimal { get { if (Numerator % Denominator == 0) return false; var primes = MathAlgorithms.Primes(Denominator); foreach (int n in primes) { if (n != 2 && n != 5) return true; } return false; } } ``` Now, I'm trying to get the repeated number. I'm checking this web site: http://en.wikipedia.org/wiki/Repeating_decimal ``` public decimal RepeatingDecimal() { if (!IsRepeatingDecimal) throw new InvalidOperationException("The fraction is not producing repeating decimals"); int digitsToTake; switch (Denominator) { case 3: case 9: digitsToTake = 1; break; case 11: digitsToTake = 2; break; case 13: digitsToTake = 6; break; default: digitsToTake = Denominator - 1; break; } return MathExtensions.TruncateAt((decimal)Numerator / Denominator, digitsToTake); } ``` But I really realized, that some numbers has a partial decimal finite and later infinite. For example: 1/28 Do you know a better way to do this? Or an Algorithm?