算法:排序,求出相邻两项的差,再求他们的最大公约数 就是公差
知道了首项,末项,公差,有几项就很好求了
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+10;
int a[N];
int d[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);
bool tag=false;
for(int i=1;i<n;i++){
d[i]=a[i]-a[i-1];//求相邻两项的差
if(d[i]==0)tag=true;//差为0 需要特殊处理,还不能影响后面的输入
}
if(tag){cout<<n<<"\n";return 0;}
int det;
for(int i=1;i<n-1;i++){//求出n个数的最大公约数就是公差
det=gcd(d[i],d[i+1]);
d[i+1]=det;
}
//if(det==0){cout<<n<<"\n";return 0;}//错误数据 3 \n 1 1 1
int res=(a[n-1]-a[0])/det+1;
cout<<res<<"\n";
return 0;
}