利用递归求最大公约数和最小公倍数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利⽤递归求最⼤公约数和最⼩公倍数
使⽤欧⼏⾥德算法,这个已经有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;
1import java.util.Scanner;
2
3public class Test_4 {
4public static int f(int a, int b) { // 求最⼤公约数
5if (a < b) {// 保证a⼤于b
6int temp = a;
7 a = b;
8 b = temp;
9 }
10if (b == 0) {
11return a;
12 }
13return f(b, a % b);
14 }
15
16public static int min(int a, int b) {// 求最⼩公倍数
17return a * b / f(a, b); // 直接⽤两个数相乘来除以最⼤公倍数的⽅法
18 }
19
20public static void main(String[] args) {
21 Scanner sc = new Scanner(System.in);
22int n = sc.nextInt();
23int m = sc.nextInt();
24int sum = f(n, m);
25 System.out.println(sum);
26int sum2 = min(n, m);
27 System.out.println(sum2);
28 }
29 }。