问题描述:
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入样式:
5
2 6 4 10 20
输出样式:
10
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int[] a=new int[N];
for (int i = 0; i < N; i++) {
a[i]=sc.nextInt();
}
int min=a[0];//最小值
for (int i = 1; i < a.length; i++) {
if(min>a[i]) {
min=a[i];
}
}
int max=a[0];//最大值
for (int i = 0; i < a.length; i++) {
if(max<a[i]) {
max=a[i];
}
}
int m=a[1]-a[0];
int l=0;
int d=Math.abs(m);//差最小
for (int i = 0; i < a.length; i++) {
for (int j = i+1; j < a.length; j++) {
l=a[j]-a[i];
if(d>Math.abs(l)) {
d=Math.abs(l);
}
}
}
int e=0;//存储等差数列d
int z=0;
for (int i = d; i >= 1; i--) {
for (int j = 0; j < a.length; j++) {
if(Math.abs(a[j]-min)%i!=0) {
z=1;
}
if(j==a.length-1) {
if(z==0) {
e=i;
break;
}
}
}
if(e==i) {
break;
}
z=0;
}
if(e==0) {
System.out.println(N);
}else {
int num=0;
for (int i = min; i <= max; i=i+e) {
num++;
}
System.out.println(num);
}
}
}
以上代码比较繁琐会超时所以用下面这代码;
import java.util.*;
public class Main3 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;++i) arr[i]=sc.nextInt();
//一定要先对数组进行排序
Arrays.sort(arr);
//先赋值为第一个相邻差值
int cut=arr[1]-arr[0];
for(int i=2;i<n;++i){
//不断通过gcd公式获得最大公约数
cut=gcd(cut,arr[i]-arr[i-1]);
}
//这里一定要特判公差为0的情况,否则下面会出现除零异常
if(cut==0){
System.out.println(n);
}else
//注意这里要加+1。因为前面获取的值不包括数列中最小的值
System.out.println((arr[n-1]-arr[0])/cut+1);
}
//获取a和b的最大公约数,不了解的可以看前面的蓝桥真题
static int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
}