概念:
最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),指某几个整数共有因子中最大的一个。
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
算法:
1、描述(欧几里德算法): 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。
其计算原理依赖于下面的定理:
定理:gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)
证明:a可以表示成a = kb + r,则r = a mod b
假设d是a,b的一个公约数,则有
d|a, d|b,而r = a - kb,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证
2、源码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h>
2 #include <iostream>
3 #include <math.h>
4
5 usingnamespace std;
6
7 #define GCD_Example(Result, x, y) \
8 { \
9 if ((Result =(GCD(x, y))) ==1) \
10 { \
11 cout<<x<<" 与 "<<y<<" 是互质数."<<endl; \
12 } \
13 else \
14 { \
15 cout<<x<<" 与 "<<y<<" 的最大公约数为:"<<Result<<endl; \
16 } \
17 }
18
19 long GCD( long KeyE, long fn );
20
21 int main(int argc, char* argv[])
22 {
23 long a =12;
24 long b =17;
25 long c =18;
26 long Result =0;
27 GCD_Example(Result, a, b);
28 GCD_Example(Result, a, c);
29 return0;
30 }
31
32 // 求两数最大公约数,若返回值为1则说明两数为互质数
33 long GCD( long KeyE, long fn )
34 {
35 long iDividend = fn; // 被除数
36 long iDivisor = KeyE; // 除数
37 long iResidual = iDividend%iDivisor; //余数
38 // 辗转相除法
39 while (iResidual !=0)
40 {
41 //将除数作为被除数
42 iDividend=iDivisor;
43 //把余数作为除数
44 iDivisor=iResidual;
45 //求新的余数
46 iResidual=iDividend%iDivisor;
47 }
48 return iDivisor;
49 }
【参考资料 感谢作者】
欧几里德算法:http://baike.baidu.com/view/1241014.htm
最大公约数:http://baike.baidu.com/view/47637.htm
快捷操作:
坚其志,苦其心,劳其力,事无大小,必有所成。
@如有侵权,请作者本人尽快与我(chrayo#163.com)联系,我将及时删除侵权内容。