GCD(最大公约数)

 最大公约数
Content
   算法介绍
   递推写法
   递归写法
 算法介绍——欧几里得算法(辗转相除法), 欧几里得算法是用来求两个正整数最大公约数的算法,以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数(有点绕可能不懂,没事!看演算过程)
时间复杂度(O(logN))
 假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
 m        n
 1997 /  615 = 3  (余 152)
 615   /  152 = 4  (余7)
 152   /  7     = 21(余5)
 7       /  5     = 1  (余2)
 5       /  2     = 2  (余1)
 2       /  1     = 2  (余0)
 至此,最大公约数为1
 两个数的最小公倍数是两个数之积除以他们的最大公因数
 
/****** 本代码为递推写法******/
 1 #include <iostream>
 2 int main()
 3 {
 4     int m, n;
 5     scanf("%d%d", &n, &m);
 6     while (n)
 7     {
 8         int t = n;
 9         n = m % n;
10         m = t;
11     }
12     printf("%d", m);
13     return 0;
14 }
 
/****** 本代码为递归写法******/
 1 #include <stdio.h>
 2 long long gcd(long long m,long long n) {
 3     if(n) return gcd(n,m%n);
 4     else return m;
 5 }
 6 int main() {
 7     long long n, m;
 8     while(scanf("%d%d",&n,&m) != EOF) {
 9         printf("%d\n",gcd(m,n));
10     }
11     return 0;
12 }

 

 

posted @ 2021-01-17 20:41  Kirk~~  阅读(450)  评论(0编辑  收藏  举报