/*
名稱: gcd.c
作者: 洪朝貴 http://www.cyut.edu.tw/~ckhung/
功能: 從命令列上讀入兩個整數, 印出它們的最大公因數. 適合練習除錯.
      (本程式沒有什麼嚴重的錯誤, 但是利用除錯程式如 gdb 的「一步一步執行」
      功能, 讀者可以更加瞭解程式運作的流程.)
*/

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>		/* 用到 assert */

int gcd(int a, int b);		/* 先宣告 (declare), 等一下再定義 (define) */

int main(int argc, char *argv[])
{
    int i, j;
    assert(3 == argc);		/* 偷懶的寫法: 該檢查處以 "斷言" 敷衍 */
    i = atoi(argv[1]);
    j = atoi(argv[2]);
    printf("gcd of %d and %d is: %d\n", i, j, gcd(i,j));
    return 0;
}

int gcd(int a, int b)		/* 現在要對函數 gcd 作定義了 */
{
    int t;
    assert(0 < a && 0 < b);	/* 我們只會處理正整數的最大公因數 */
    while (0 != a) {		/* 只要除數不為 0 ... */
	t = b % a;		/* 把 a, b 兩造相除 */
	b = a;			/* 現在的除數在下一回合要扮演被除數的角色 */
	a = t;			/* 現在的餘數在下一回合要扮演除數的角色 */
    }
    return b;
}

