思路:
求出将数按照从小到大排列,求出两个数之间的差,再将每个差求最大公约数,最后的答案即为等差数列的公差d,再根据公式 a1 + (n - 1) d = an 求出 n 即可。
小细节,求 n 的公式为 当题目中给出的数据全为同一个值时,d为0,这种情况需要特判。
最大公约数的求法——辗转相除法:
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
完整代码(C++):
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a + n);
int g = a[1] - a[0];
for(int i = 1; i < n; i++)
g = gcd(g, a[i] - a[i - 1]);
if(g)
cout << (a[n - 1] - a[0]) / g + 1 << endl;
else
cout << n << endl;
return 0;
}