static bool CheckFrancCurious(Fraction frac) { int divisorNum1 = frac.Divisor / 10; int divisorNum2 = frac.Divisor % 10; int dividendNum1 = frac.Dividend / 10; int dividendNum2 = frac.Dividend % 10; Fraction fracFinal = frac.ToFinalFraction(); if (divisorNum1 == dividendNum1) { Fraction frac2 = new Fraction() { Dividend = dividendNum2, Divisor = divisorNum2 }; Fraction frac2Final = frac2.ToFinalFraction(); return fracFinal.Equals(frac2Final); } if (divisorNum1 == dividendNum2) { Fraction frac2 = new Fraction() { Dividend = dividendNum1, Divisor = divisorNum2 }; Fraction frac2Final = frac2.ToFinalFraction(); return fracFinal.Equals(frac2Final); } if (divisorNum2 == 0) return false; if (divisorNum2 == dividendNum1) { Fraction frac2 = new Fraction() { Dividend = dividendNum2, Divisor = divisorNum1 }; Fraction frac2Final = frac2.ToFinalFraction(); return fracFinal.Equals(frac2Final); } if (divisorNum2 == dividendNum2) { Fraction frac2 = new Fraction() { Dividend = dividendNum1, Divisor = divisorNum1 }; Fraction frac2Final = frac2.ToFinalFraction(); return fracFinal.Equals(frac2Final); } return false; }
static void Main(string[] args) { Fraction temp = new Fraction() { Divisor = 49, Dividend = 98 }; List<Fraction> fracs = new List<Fraction>(); for (int i = 10; i < 100; i++) { for (int j = i + 1; j < 100; j++) { Fraction frac = new Fraction() { Divisor = i, Dividend = j }; fracs.Add(frac); } } List<Fraction> finalFracs = new List<Fraction>(); foreach (Fraction frac in fracs) { if (CheckFrancCurious(frac)) finalFracs.Add(frac); } int divisor = 1, dividend = 1; foreach (Fraction frac in finalFracs) { divisor *= frac.Divisor; dividend *= frac.Dividend; } Fraction resultFrac = new Fraction() { Divisor = divisor, Dividend = dividend }; Console.WriteLine(resultFrac.ToFinalFraction().Dividend); }
public Fraction ToFinalFraction() { Fraction temp = new Fraction() { Divisor = this.Divisor, Dividend = this.Dividend }; int min = Math.Min(temp.Dividend, temp.Divisor); while (true) { if (min < 2) break; if (temp.Divisor % min == 0 && temp.Dividend % min == 0) { temp.Dividend = temp.Dividend / min; temp.Divisor = temp.Divisor / min; min = Math.Min(temp.Dividend, temp.Divisor); continue; } min--; if (min < 2) break; if (temp.Divisor % min == 0 && temp.Dividend % min == 0) { temp.Dividend = temp.Dividend / min; temp.Divisor = temp.Divisor / min; min = Math.Min(temp.Dividend, temp.Divisor); continue; } } return temp; }
static void Main(string[] args) { List<Fraction> fracList = new List<Fraction>(); Fraction target = new Fraction(){ Divisor = 3, Dividend = 7}; Fraction result = new Fraction() { Divisor = 1, Dividend = MAXDIVIDEND }; for (int i = 2; i <= MAXDIVIDEND; i++) { Fraction frac = FindCloseTo(i, target); if (frac == null) continue; //Console.WriteLine(string.Format("[{0}] - {1}", i, frac.ToString())); if (frac > result) { result = frac; //Console.WriteLine(string.Format("current close to 3/7 is {0}",result.ToString())); } } Console.WriteLine("Result is {0}", result.Divisor); }
static Fraction FindCloseTo(int dividend, Fraction target) { int divisor = (dividend * target.Divisor - 1) / target.Dividend; return new Fraction() { Dividend = dividend, Divisor = divisor }; }