利用遞歸求最大公約數和最小公倍數


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM