public static string GetPeriodicFraction(RationalNumber number) { var remainders = new Dictionary <BigInteger, int>(); var resultDigits = new List <BigInteger>(); var currentRemainder = number.Numerator % number.Denominator; while (true) { var temp = currentRemainder * 10; currentRemainder = temp % number.Denominator; resultDigits.Add(BigInteger.Abs(temp / number.Denominator)); if (currentRemainder == 0) { break; } if (remainders.ContainsKey(currentRemainder)) { if (resultDigits.Last() == resultDigits.First()) { resultDigits.RemoveAt(resultDigits.Count - 1); } break; } remainders[currentRemainder] = resultDigits.Count; } var integerPart = $"{number.Numerator / number.Denominator}."; var periodicFraction = new StringBuilder(integerPart + string.Concat(resultDigits)); if (currentRemainder == 0) { return(periodicFraction.ToString()); } var index = integerPart.Length + remainders[currentRemainder] - (remainders.Count == resultDigits.Count ? 1 : 0); return(periodicFraction.Insert(index, '(').Append(")").ToString()); }
internal static void Main() { var xDoc = new XmlDocument(); xDoc.Load("Data.xml"); var xmlRoot = xDoc.DocumentElement; var periodicFraction = string.Empty; var rationalNumbers = new List <RationalNumber>(); foreach (XmlNode xmlNode in xmlRoot) { var numerator = new BigInteger(); var denominator = new BigInteger(); foreach (XmlNode childNode in xmlNode.ChildNodes) { if (childNode.Name == "numerator") { numerator = BigInteger.Parse(childNode.InnerText); } if (childNode.Name == "denominator") { denominator = BigInteger.Parse(childNode.InnerText); } if (childNode.Name == "periodic") { periodicFraction = childNode.InnerText; } } rationalNumbers.Add(new RationalNumber(numerator, denominator)); } foreach (var number in rationalNumbers.Take(2)) { Console.WriteLine(number.Numerator + "/" + number.Denominator); Console.WriteLine(RationalNumber.GetPeriodicFraction(number)); Console.WriteLine(); } var addition = rationalNumbers[0] + rationalNumbers[1]; Console.WriteLine("Addition: " + addition.Numerator + "/" + addition.Denominator); Console.WriteLine(RationalNumber.GetPeriodicFraction(addition) + "\n"); var subtraction = rationalNumbers[0] - rationalNumbers[1]; Console.WriteLine("Subtraction: " + subtraction.Numerator + "/" + subtraction.Denominator); Console.WriteLine(RationalNumber.GetPeriodicFraction(subtraction) + "\n"); var multiplication = rationalNumbers[0] * rationalNumbers[1]; Console.WriteLine("Multiplication:" + multiplication.Numerator + "/" + multiplication.Denominator); Console.WriteLine(RationalNumber.GetPeriodicFraction(multiplication) + "\n"); var division = rationalNumbers[0] / rationalNumbers[1]; Console.WriteLine("Division: " + division.Numerator + "/" + division.Denominator); Console.WriteLine(RationalNumber.GetPeriodicFraction(division) + "\n"); Console.WriteLine("Periodic Fraction: " + periodicFraction); var ordinaryFraction = RationalNumber.GetOrdinaryFraction(periodicFraction); Console.WriteLine("Ordinary Fraction: " + ordinaryFraction.Numerator + "/" + ordinaryFraction.Denominator); }
public static RationalNumber GetReducedRationalNumber(RationalNumber number) { var greatestCommonDivisor = BigInteger.GreatestCommonDivisor(number.Numerator, number.Denominator); return(new RationalNumber(number.Numerator / greatestCommonDivisor, number.Denominator / greatestCommonDivisor)); }