zoukankan      html  css  js  c++  java
  • 利用递归求最大公约数和最小公倍数

    使用欧几里德算法,这个已经有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 }
  • 相关阅读:
    node中__dirname、__filename、process.cwd()、process.chdir()表示的路径
    formidable模块的使用
    对象函数的readFileSyc类
    nodejs的事件驱动理解
    书籍类
    Cookie的弊端
    Codeforces 1015 E(模拟)
    Codeforces 1015D(贪心)
    牛客网暑期ACM多校训练营(第五场)I(树状数组)
    2018牛客暑假多校第五场 A(二分答案)
  • 原文地址:https://www.cnblogs.com/limn/p/6528717.html
Copyright © 2011-2022 走看看