Project Euler > Problem 33 > Digit canceling fractions (Java Solution)

Problem:

The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, which is correct, is obtained by cancelling the 9s.

We shall consider fractions like, 30/50 = 3/5, to be trivial examples.

There are exactly four non-trivial examples of this type of fraction, less than one in value, and containing two digits in the numerator and denominator.

If the product of these four fractions is given in its lowest common terms, find the value of the denominator.


Solution:

100


Code:
The solution may include methods that will be found here: Library.java .

public interface EulerSolution{

public String run();

}
/* 
 * Solution to Project Euler problem 33
 * By Nayuki Minase
 * 
 * http://nayuki.eigenstate.org/page/project-euler-solutions
 * https://github.com/nayuki/Project-Euler-solutions
 */


public final class p033 implements EulerSolution {
 
 public static void main(String[] args) {
  System.out.println(new p033().run());
 }
 
 
 /* 
  * Consider an arbitrary fraction n/d:
  *   Let n = 10 * n1 + n0 be the numerator.
  *   Let d = 10 * d1 + d0 be the denominator.
  * As stated in the problem, we need 10 <= n < d < 100.
  * We must disregard trivial simplifications where n0 = d0 = 0.
  * 
  * Now, a simplification with n0 = d0 is impossible because:
  *   n1 / d1 = n / d = (10*n1 + n0) / (10*d1 + n0).
  *   n1 * (10*d1 + n0) = d1 * (10*n1 + n0).
  *   10*n1*d1 + n1*n0 = 10*d1*n1 + d1*n0.
  *   n1*n0 = d1*n0.
  *   n1 = d1.
  *   This implies n = d, which contradicts the fact that n < d.
  * Similarly, we cannot have a simplification with n1 = d1 for the same reason.
  * 
  * Therefore we only need to consider the cases where n0 = d1 or n1 = d0.
  * In the first case, check that n1/d0 = n/d; in the second case, check that n0/d1 = n/d.
  */
 public String run() {
  int numer = 1;
  int denom = 1;
  for (int d = 10; d < 100; d++) {
   for (int n = 10; n < d; n++) {
    int n0 = n % 10, n1 = n / 10;
    int d0 = d % 10, d1 = d / 10;
    if (n1 == d0 && n0 * d == n * d1 || n0 == d1 && n1 * d == n * d0) {
     numer *= n;
     denom *= d;
    }
   }
  }
  return Integer.toString(denom / Library.gcd(numer, denom));
 }
 
}


No comments :

Post a Comment

Follow Me

If you like our content, feel free to follow me to stay updated.

Subscribe

Enter your email address:

We hate spam as much as you do.

Upload Material

Got an exam, project, tutorial video, exercise, solutions, unsolved problem, question, solution manual? We are open to any coding material. Why not upload?

Upload

Copyright © 2012 - 2014 Java Problems  --  About  --  Attribution  --  Privacy Policy  --  Terms of Use  --  Contact