Wednesday, 9 October 2013

Greatest common divisor (GCD) with working

The one thing I hated about maths in school and university was the fact that I had to show my working. Of course I knew that it helped the marker see that you understood the problem, but I just found it incredibly tedious. Particularly when I knew the answer right after reading the question.

I recall back in university I was asked many times to find the greatest common divisor (GCD) of two integers using Euclid's algorithm. This is basically the exact situation I described above, you can work out the greatest common divisor in your head fairly easily with a smallish number but to actually show your working can take a quite a bit of writing.

Find the greatest common divisor of 108 and 30

108 = 30 x 3 + 18
 30 = 18 x 1 + 12
 18 = 12 x 1 +  6
 12 =  6 x 2 +  0
       ^

gcd(108, 30) = 6

So after doing it a couple of times I went ahead and spent a few minutes writing a little program that solved the problem with working shown. I lost the original source but have reproduced it for a little fun. :)

Code

View on GitHub

public static int gcd(int a, int b) {
    int dividend;
    int divisor = (a > b ? a : b);
    int quotient;
    int remainder = (a < b ? a : b);

    System.out.format("Find gcd(%d, %d)\n", a, b);

    do {
        dividend = divisor;
        divisor = remainder;

        quotient = dividend / divisor;
        remainder = dividend % divisor;

        System.out.format(
            "%d = %d x %d + %d\n", 
            dividend, divisor, quotient, remainder);
    } while (remainder != 0);

    System.out.format(
        "\ngcd(%d, %d) = %d\n\n",
        a, b, divisor);

    return divisor;
}