【网易笔试题】等差数列

题目描述

给一个长度为n的数组a,找一个最大的正整数d,使得对于所有的i,满足ai+1 - ai 是 d 的整数倍。2 ≤ n ≤ 10^5,1 ≤ ai ≤ 10^18。

思路

先求出所有的前后数字的差,求最大公约数。
如果出现 ai+1 < ai ,说明不存在。

代码

#include 
#include 
#include 
#include 
using namespace std;

#define LL long long

LL gcd(LL i, LL j){
    int r = i % j;
    return r == 0 ? j : gcd(j, r);
}

LL ngcd(vector<LL>& v, LL n)
{
    if(n==1) return v[0];
    return gcd(v[n-1],ngcd(v,n-1));
}

int main() {
    int n;
    while(cin >> n) {
        vector<LL> nums;
        for (int i=0; i<n; ++i) {
            LL tmp;
            cin >> tmp;
            nums.push_back(tmp);
        }

        vector<LL> diff;

        LL res = 0;
        for (int i=1; i<n; ++i) {
            LL tmp = nums[i] - nums[i-1];
            if (tmp < 0) {
                res = -1;
                break;
            }
            diff.push_back(tmp);
        }

        if (res != -1) {
            sort(diff.begin(), diff.end());
            res =  ngcd(diff, diff.size());
        }
        cout << res << endl;
    }
    return 0;
}

/*
4
1 3 7 15
*/

你可能感兴趣的:(笔试/面试题)