题解:
思路:
A 等差数列
GCD(最大公约数,辗转相除法,注意Long)
将每两个连续数的差值视为一个新的数列,求GCD,如果有差值小于等于0,直接输出-1。
多个数的最大公约数(模板):
//求数组a[]的最大公约数
int gcd(int a,int b)
{
return b == 0 ? a : gcd(b, a % b);
}
temp = a[0];
for (i = 1; i < n ; i++)
{
temp = gcd(temp,a[i]);
}
//temp即为所求最大公约数
代码:
// 超时
// import java.util.*;
// public class Main_1 {
// public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
// while(sc.hasNextInt())
// {
// int n = sc.nextInt();
// long a[] = new long[n + 1];
// for(int i = 1; i <= n; i++)
// {
// a[i] = sc.nextLong();
// }
// long max_value = 1000000000;
// Set<Long> res = new HashSet<>();
// for(long d = 1; d <= a[2]; d++)
// {
// for(long k = 1; k <= a[2]; k++)
// {
// for(int i = 1; i < n; i++)
// {
// if((a[i + 1] - a[i]) / k == d)
// {
// res.add(d);
// }
// }
// }
// }
// long ans[] = new long[res.size()];
// int index = 0;
// Iterator<Long> it = res.iterator();
// while(it.hasNext())
// {
// ans[index++] = it.next();
// }
// for(int i = 0; i < res.size(); i++)
// {
// if(ans[i] != 1)
// {
// System.out.println(ans[i]);
// break;
// }
// }
// if(res.isEmpty())
// {
// System.out.println(-1);
// }
// }
// }
// }
import java.util.*;
public class Main_1 {
// 辗转相除法求最大公约数 gcd
public static long gcd(long a, long b)
{
return b == 0 ? a : gcd(b, a % b);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt())
{
int n = sc.nextInt();
long a[] = new long[n];
List<Long> list = new ArrayList<>();
for(int i = 0; i < n; i++)
{
a[i] = sc.nextLong();
if(i >= 1)
{
long temp = a[i] - a[i - 1];
if(temp <= 0)
{
System.out.println(-1);
return;
}
list.add(temp);
}
}
if(list.size() == 0)
{
System.out.println(-1);
return;
}
if(list.size() == 1)
{
System.out.println(list.get(0));
return;
}
long res = list.get(0);
for(int i = 1; i < list.size(); i++)
{
res = gcd(res, list.get(i));
}
System.out.println(res == 0 ? -1 : res);
}
}
}
// 输入用例1:
// 4
// 1 3 7 15
// 输出用例1:
// 2
// 输入用例2:
// 4
// 1 2 1 1
// 输出用例2:
// -1