题目链接:http://ac.jobdu.com/problem.php?pid=1056

这道题我最开始用了很普通的方法,当然可以AC

 1 #include <iostream>
 2 #include <math.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int a, b, index1, index2;
 8     int ar[100000], br[100000];
 9 
10     while(cin>>a>>b)
11     {
12         index1 = 0;
13         for(int i = 1; i <= a; i++)
14         {
15                 if(a%i == 0)
16                     ar[index1++] = i;
17         }
18         index2 = 0;
19         for(int i = 1; i <= b; i++)
20         {
21             if(b%i == 0)
22                 br[index2++] = i;
23         }
24 
25         int max = 0;
26         for(int i = 0; i < index1; i++)
27         {
28             for(int j = 0; j < index2; j++)
29             {
30                 if(ar[i] == br[j] && max < ar[i])
31                     max = ar[i];
32             }
33         }
34         cout<<max<<endl;
35     }
36     return 0;
37 }
View Code

后来才知道还可以用欧几里得的算法写,更简单

原理:

定理:gcd(a,b) = gcd(b,a mod b)

证明: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)的公约数

假设d 是(b,a mod b)的公约数,则 
d | b , d |r ,但是a = kb +r 
因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

欧几里德算法就是根据这个原理来做的,其算法用C++语言描述为:

int Gcd(int a, int b)
{
    if(b == 0)
        return a;
    return Gcd(b, a % b);
}
 
相当于做一下笔记,以便自己复习!
posted on 2017-09-05 20:54  小小糖果tt  阅读(101)  评论(0)    收藏  举报