作为蓝桥杯必考算法,我们一般方法为辗转相除法时间复杂度为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
题目描述
输入三个正整数 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
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 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);
}
}