gcd(最小公约数)要记住(我是菜鸡,差点把冒号前后写错了)
思路:用sort排序,然后依次从大到小求相邻数的差值,然后求这些差值的最大公约数,就是最大的公差
(一定要注意不存在最大公约数的情况,即存在两个数相等,此时应输出n的值)
参考代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cmath> #include<vector> #include<set> #include<sstream> #include<cstring> #include<utility> using namespace std; typedef long long ll; typedef long l; const int N=100010; int n; int a[N],b[N]; void read(int &x){ int f=1;x=0;char c=getchar(); while(c>'9'||c<'0'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } x=x*f; } int gcd(int x,int y){ return y==0?x:gcd(y,x%y); } int main(){ scanf("%d",&n); for(int i=0;i<n;i++)read(a[i]); sort(a,a+n); int x,ok=1; for(int i=0;i<n-1;i++){ b[i]=a[i+1]-a[i]; if(b[i]==0){ ok=0;break; } if(i>0){ if(i==1)x=gcd(b[0],b[1]); else{ int y=gcd(b[i-1],b[i]); x=gcd(x,y); } } } if(ok==0)cout<<n; else cout<<(a[n-1]-a[0])/x+1; }
0.0分
0 人评分