2019年第十届蓝桥杯C/C++大学B组试题.H.等差数列

数论-求最大公约数 辗转相除法

数学老师给小明出了一道等差数列求和的题目。

但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入格式
输入的第一行包含一个整数 N。

第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数
列中的顺序给出)

输出格式
输出一个整数表示答案。

数据范围
2≤N≤100000,
0≤Ai≤109
输入样例:
5
2 6 4 10 20
输出样例:
10
样例解释
包含 2641020 的最短的等差数列是 2468101214161820

#include 
#include 
#include 

using namespace std;

const int N = 100010;

int a[N];

//求最大公约数   最小公倍数=a*b/最大公约数求出欧几里得算法gcd(
//辗转相除法
int gcd(int a, int b){
    return b ? gcd(b, a % b) : a;
}

int main(){
    int n;
    scanf("%d", &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[0]); 
    //所有数和第一个数的差的最大公约数,初始为0,0和任意数的最大
    //公约数为它本身

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

    return 0;
}

//每一项与第一项的差一定是d的倍数
//当d != 0 时, (a末 - a初) / d  + 1 ---- 让公差d最大即可
//当d  == 0 时,答案为 n 

你可能感兴趣的:(随缘蓝桥杯,c++,算法,数据结构,c语言)