使用歐幾里德算法,這個已經有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 }