[蓝桥杯][2019年第十届真题]等差数列

思路

要求包含这 N 个整数的最短的等差数列有几项,则首项取数组(A)中的最小值,末项取数组(A)中的最大值。

假设公差为(d),首相为(A[0]),则相邻两项的差(A[i]-A[0],i in [1,n-1])一定是公差(d)的倍数,于是对所有相邻两项的差求(gcd)即可得到公差(d)

const int N=1e5+10;
int a[N];
int n;

int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

int main()
{
    cin>>n;

    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);

    int d=0;
    for(int i=1;i<n;i++)
        d=gcd(d,a[i]-a[i-1]);

    if(d == 0) cout<<n<<endl;
    else cout<<(a[n-1]-a[0])/d+1<<endl;
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14613632.html