题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋯,AN。(注意 A1∼AN 并不一定是按等差数列中的顺序给出 )。
输出格式
输出一个整数表示答案。
输入输出样例
输入 #1复制
5 2 6 4 10 20
输出 #1复制
10
说明/提示
包含 2,6,4,10,20
的最短的等差数列是 2,4,6,8,10,12,14,16,18,20
。
对于所有评测用例,2≤N≤10^5,0≤Ai≤10^9。
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr);
int[] arr_ = new int[n - 1];//差数组
for(int i = 0;i < arr_.length;i++) {
arr_[i] = arr[i + 1] - arr[i];
}
int d = arr_[0];
for(int i = 1;i < n - 1;i++) {
d = gcd(d,arr_[i]);
}
if(d == 0)
System.out.print(n);//常数列
else
System.out.print((arr[n - 1] - arr[0]) / d + 1);
}
public static int gcd(int a,int b) {//辗转相除法求最大公因数
if(a < b) {
int temp = a;
a = b;
b = temp;
}
if(b == 0) return a;
return gcd(b,a % b);
}
}
题解分析:题目考点是计算数组的最大公因数,题解中使用辗转相除法计算两个数的最大公因数,在计算数组的最大公因数时可以先将第一个数作为最大公因数d,之后不断计算d与其他数的最大公因数并更新d。
拓展:知道了最大公约数的计算方法我们也可以借助最大公约数求最小公倍数--公式:两个数的乘积等于这两个数的最大公约数与最小公倍数的积。