试题H 等差数列

1. 题目

 

 

 

输入样例:
5
2 6 4 10 20

输出样例:
10

2. 分析:

  考的就是等差数列的知识,要让包含几个数的数列最短,那肯定是间隔公差大点,包含的数就少点。

下面每个数与第一个数的间隔为2、4、8、18,求这几个数的最大公约数,即公差。求最大公约数用欧几里得算法(辗转相除法)

项数n = (末项 - 首项)/ d    + 1。

 

 

3.代码

#include <bits/stdc++.h>
using namespace std;

int a[100010];

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


int main() {
    int n, d = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    sort(a,a+n);   //一定要排序先
    for (int i = 1; i < n; i++) {
        d = gcd(d, a[i] - a[0]); //每项的数和第一项的数的间隔,
    }
    if (d)
        cout << (a[n - 1] - a[0]) / d + 1 << endl;
    else
        cout << n << endl; //如果公差是0,就是给出的数
    return 0;
}

 

posted @ 2022-03-24 21:37  湘summer  阅读(32)  评论(0编辑  收藏  举报