C++等差數列(數論、歐幾里得輾轉相除gcd)

赴星辰大海發表於2020-10-10

數學老師給小明出了一道等差數列求和的題目。
但是粗心的小明忘記了一部分的數列,只記得其中 N
個整數。
現在給出這 N個整數,小明想知道包含這 N個整數的最短的等差數列有幾項?
輸入格式
輸入的第一行包含一個整數 N。
第二行包含 N個整數 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN並不一定是按等差數列中的順序給出)
輸出格式
輸出一個整數表示答案。
資料範圍
2≤N≤100000,0≤Ai≤109
輸入樣例:
5
2 6 4 10 20
輸出樣例:
10
樣例解釋
包含 2、6、4、10、20
的最短的等差數列是 2、4、6、8、10、12、14、16、18、20。

想要數列長度最短,就要公差最大,公差最大能取除第一項外各項與第一項之差的最大公約數。

AC程式碼:

#include<stdio.h>
#include<algorithm>

int n;
int a[100010];

int gcd(int a,int b)
{
    int d;
    if(a<b) std::swap(a,b);
    while(b)
    {
        d=a%b;
        a=b;
        b=d;
    }
    return a;
}

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

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

    if(!d) printf("%d",n);
    else printf("%d",(a[n-1]-a[0])/d+1);

    return 0;
}

相關文章