人较笨且记性不好,故记录在此.折叠代码打不开请F5.本博中很多是转载收录其他网友的文章(原文地址请见博文末尾),所有权为原作者所有!!!
此博客已不再更新和维护,欢迎关注我的github新博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

概念:
  最大公约数(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、源码:

View Code
 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
 

 

posted on 2011-09-18 13:28  子坞  阅读(954)  评论(0编辑  收藏  举报