欧几里德算法求最大公约数

求最大公约数有暴力法和辗转相除法

时间复杂度

暴力:O(N)

辗转相除法:O(2logN)

 

辗转相除法原理:

设c为A B 的最大公约数 则存在K1 K2 使 A=K1*c B=K2*c;

r为A模B r=A - K3*B;

      r=K1*c-K3*k2*c;

    r=(K1-K2*K3)*c;

所以A 和 B 的余数一定是最大公约数c的倍数

 

 1 #include <stdio.h>
 2 
 3 int gcd(int a, int b)
 4 {
 5     int temp, r;
 6     if(a<b)
 7     {
 8         temp = a;
 9         a = b;
10         b = temp;
11     }
12     while(a % b)
13     {
14         r = a%b;
15         a = b;
16         b = r;
17     }
18     return b;
19 }
20 
21 int main()
22 {
23     int a, b, answer;
24     scanf("%d%d",&a,&b);
25     answer = gcd(a,b);
26     printf("%d\n",answer);
27     return 0;
28 }

 

posted @ 2017-02-12 10:19  码农CHQ  阅读(139)  评论(0编辑  收藏  举报