輾轉相除法

//
//  main.c
//  GCD
//
//  Created by andy on 15/5/11.
//  Copyright (c) 2015年 Andy. All rights reserved.
//

#include <stdio.h>
#define max(x,y) x > y? x : y
#define min(x,y) x < y? x: y

int GCD(int,int);
int GCD1(int,int);

// 兩數的最大公約數 等於 其中較小數和兩數的差的最大公約數
// 輾轉相除法:
//    不斷縮小這兩個數,直到其中一個變爲0,這樣那個不爲0的數就是兩個數的最大GCD(Greastest Common Divisor)

int main(int argc, const char * argv[]) {
    printf("%d",GCD1(105, 252));
    return 0;
}

// 這個輾轉相除法??直接找出 兩數求餘的 最小公倍數*n 再通過較小數和 最小公倍數*n 之間再計算
int GCD(int a,int b) {
    int ma = max(a, b);
    int mi = min(a, b);
    printf("(ma,mi)->(%d,%d)\n\n",ma,mi);
    if (ma % mi != 0) {              // 兩數之差不爲0
        printf("GCD(a,b)->(%d,%d)\n\n",mi,(ma % mi));
        return GCD(mi, (ma % mi));  // 接着計算較小數和兩數之差的GCD
    }
    return mi;
}



// 輾轉相除法(歐幾里德算法)
int GCD1(int a,int b) {
    int ma = max(a, b);
    int mi = min(a, b);
    printf("(ma,mi)->(%d,%d)\n\n",ma,mi);
    if (mi != 0) {              // 兩數之差不爲0
        printf("GCD(a,b)->(%d,%d)\n\n",mi,(ma % mi));
        return GCD1(mi, (ma - mi));  // 接着計算較小數和兩數之差的GCD
    }
    return ma;
}

發佈了137 篇原創文章 · 獲贊 8 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章