题目描述
样例
输入:
5
2 6 4 10 20
输出:
10
代码
思路:先对数列进行升序排序,之后求取相邻两个数之间的公差的最大公约数即可。最后利用公式(a[n-1]-a[0])/d+1,即可算出个数
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int a[N];
int gcd(int a,int b)//辗转相除法
{
return b?gcd(b,a%b):a;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int d=0;//d表示任意一个数和首相的公差的最大公约数。
for(int i=1;i<n;i++)
{
d=gcd(d,a[i]-a[0]);//0和任何数的最大公约数都是这个数,也可以写成a[i]-a[i-1],表示两个相邻数的公差的最大公约数。
}
if(!d) cout<<n<<endl;//判断公差为0的情况
else
{
int count1;
count1=(a[n-1]-a[0])/d+1;
cout<<count1<<endl;
}
}