最大公约数
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 ",gcd(m,n)); 10 } 11 return 0; 12 }