最大公约数gcd与最小公倍数lcm

199 阅读2分钟

作为蓝桥杯必考算法,我们一般方法为辗转相除法时间复杂度为log n 代码如下:

public static long gcd(long x,long y) {
    return y==0?x:gcd(y,x%y);
}
public static long lcm(long x,long y) {
    return x/gcd(x,y)*y;
}

解释(以gcd为例):

1.用较大的数除以较小的数得到余数

2.将较小的数与余数作为新的两个数,重复操作直至余数为零

3.余数为0的除数即为两数的最大公约数

例题1

www.luogu.com.cn/problem/B37…

题目描述

输入三个正整数 x,y,z求它们的最大公约数(Greatest Common Divisor)g:最大的正整数 g ≥1,满足 x,y,z 都是 g的倍数,即 (x mod g) = (y mod g) = (z mod g) = 0。

输入格式

输入一行三个正整数 x,y,z。

输出格式

输出一行一个整数 g,表示 x,y,z 的最大公约数。

由于只需套公式,在此不再赘述解答,请读者自行前往洛谷官网测试是否正确。

例题2

www.luogu.com.cn/problem/P86…

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入格式

输入的第一行包含一个整数 N。

第二行包含 N 个整数 A1​,A2​,⋯,AN​。(注意A1​∼AN​ 并不一定是按等差数列中的顺序给出 )。

输出格式

输出一个整数表示答案。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n =scan.nextInt();
        int []a=new int[n];
        for (int i = 0; i < n; i++) {
            a[i]=scan.nextInt();
        }
        Arrays.sort(a);
        int d=a[1]-a[0];
        for (int i = 2; i < n; i++) {
            d=gcd(d,a[i]-a[i-1]);
        }
        if(d==0){
            System.out.println(n);
        }else {
            int res =1;
            for (int i = 1; i < n; i++) {
                res+=(a[i]-a[i-1])/d;
            }
            System.out.println(res);
        }
    }
    public static int gcd(int x,int y) {
        return y==0?x:gcd(y,x%y);
    }
}