//
// 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;
}
辗转相除法
最新推荐文章于 2024-11-02 20:34:21 发布