最大公约数是数论中一个很基本的概念,求两个数的最大公约数有几种方法,可以求出两个数的所有约数,然后选择相同的最大的约数,这是一种比较笨的方法,高效的算法是由几千年以前的欧几里得提出来的,其根本思想就是利用辗转相除法来进行求解,这个可以参考一些相关的数论的书籍来获得算法的正确性,算法的实现可以参考下面。
代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream>
2 #include <cstdio>
3 using namespace std;
4
5 int GCD(int a, int b)
6 {
7 if (a == 0)
8 return b;
9 if (b == 0)
10 return a;
11 int r = 0;
12 r = a % b;
13 while (r != 0)
14 {
15 r = a % b;
16 a = b;
17 b = r;
18 }
19
20 return r;
21 }
22
23 int main()
24 {
25 int n, m;
26 while (scanf("%d %d", &n, &m) != EOF)
27 {
28 if ((n == 0) && (m == 0))
29 break;
30 printf("%d\n", GCD(n, m));
31 }
32
33 system("pause");
34 return 0;
35 }
36
2 #include <cstdio>
3 using namespace std;
4
5 int GCD(int a, int b)
6 {
7 if (a == 0)
8 return b;
9 if (b == 0)
10 return a;
11 int r = 0;
12 r = a % b;
13 while (r != 0)
14 {
15 r = a % b;
16 a = b;
17 b = r;
18 }
19
20 return r;
21 }
22
23 int main()
24 {
25 int n, m;
26 while (scanf("%d %d", &n, &m) != EOF)
27 {
28 if ((n == 0) && (m == 0))
29 break;
30 printf("%d\n", GCD(n, m));
31 }
32
33 system("pause");
34 return 0;
35 }
36