According to Donald Knuth in "The Art Of Computer Programming", the following is how to find the greatest common divisor of two positive numbers, m and n, using Euclid's Algorithm.


  
  Divide m by n and let r be the remainder.
  If r is 0, n is the answer; if r is not 0, continue to step 3.
  Set m = n and n = r. Go back to step 1.
  


Below is my implementation of this algorithm.

#include &lt;stdio.h&gt;

int greatestCommonDivisor(int m, int n)
{
    int r;

    /* Check For Proper Input */
    if((m == 0) || (n == 0))
        return 0;
    else if((m &lt; 0) || (n &lt; 0))
        return -1;

    do
    {
        r = m % n;
        if(r == 0)
            break;
        m = n;
        n = r;
    }
    while(true);

    return n;
}

int main(void)
{
    int num1 = 600, num2 = 120;
    int gcd = greatestCommonDivisor(num1, num2); 

    printf("The GCD of %d and %d is %d\n", num1, num2, gcd);

    getchar();
    return 0;
}


Though it appears to work just fine, it doesn't seem to be as elegant as I'd like, especially in the do-while loop.  Also, the while(true) seems dangerous, though I'm pretty confident that r will be reduced to 0 eventually and we'll break out of the loop.

Do you have any suggestions on either making the code more elegant or robust?


Question: In Mass Effect 3, I did not get a choice of game mode; is it because I imported a ME2 character?
Answer: There aren't really game modes per-se. Rather, they are just presets for two settings: "Combat Difficulty" and "Conversation Mode".


Action: No Decisions, Normal Difficulty
Role Playing: Full Decisions, Normal Difficulty
Story: Full Decisions, Narrative Difficulty


The default for an imported character is Role Playing. However, you can change both these options at any time from the "Narrative" and "Gameplay" sections of the options menu.

Note that if you want to get the Insanity achievement, you will have to use the options menu to change the difficulty to Insanity before leaving Earth.