题目描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。
现在给出这N个整数,小明想知道包含这N个整数的最短的等差数列有几项?
输入描述
输出描述
输出一个整数表示答案。
输入输出样例
输入:
5
2 6 4 10 20
输出:
10
最终代码c/c++
#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main(){
int n; cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int d=0;
for(int i=1;i<n;i++)
d = __gcd(d,a[i]-a[i-1]); //用STL的gcd函数
if(d==0) cout<<n<<endl;
else
printf("%d\n",(a[n - 1] - a[0]) / d + 1);
return 0;
}
过程理解
萌新:所有数字间距离最小的间隔会是公差吗?
大佬:并不是,例如(2,5,7),最小的间隔是2,但公差不是2,是1。
这道题是gcd问题。
我们只要把n个数据排序,计算它们的间隔,然后对所有间隔做GCD,其结果就为最少数量等差数列的公差。
而最少数量等于:(最大值-最小值)/公差+1。