利用递归求最大公约数和最小公倍数

使用欧几里德算法,这个已经有2000+年的历史了,这个比起上一个来的要高效,假设我们的最大公约数表示为f(a,b),并且有a>=b>0,
欧几里德就给了我们一个很好的定理,f(a,b)=f(b,a%b),有了这个等式我们就很容易得出这个算法的递归式,现在我们来看下这个等式是怎么来的
设有 r=a/b ,q=a%b
所以就有 a=a/b*b+q ----(这里的a/b*b!=a ,原因就是我们用的是整数来计算的)
也就是a=r*b+q 变换一下有:q=a-r*b 设d=f(a,b),a/d=m,b/d=n;则 有q=dm-r*dn=d(m-rn)
所以q/d也为0;设d|q表示d是q的约数;以下相同;
又有d|b;所以有d|(b,q),设D是(b,q)的最大公约数,则会有d<=D=f(a=r*b+q,由于D|(b,q),所以D|a,所以有D|(a,b)

所以有D<=d=f(a,b),结合上部分就有d<=D <+d,及D=d;

 1 import java.util.Scanner;
 2 
 3 public class Test_4 {
 4     public static int f(int a, int b) { // 求最大公约数
 5         if (a < b) {// 保证a大于b
 6             int temp = a;
 7             a = b;
 8             b = temp;
 9         }
10         if (b == 0) {
11             return a;
12         }
13         return f(b, a % b);
14     }
15 
16     public static int min(int a, int b) {// 求最小公倍数
17         return a * b / f(a, b); // 直接用两个数相乘来除以最大公倍数的方法
18     }
19 
20     public static void main(String[] args) {
21         Scanner sc = new Scanner(System.in);
22         int n = sc.nextInt();
23         int m = sc.nextInt();
24         int sum = f(n, m);
25         System.out.println(sum);
26         int sum2 = min(n, m);
27         System.out.println(sum2);
28     }
29 }

 

posted @ 2017-03-10 01:33  Kmily_Lee  阅读(6181)  评论(0编辑  收藏  举报