2019蓝桥杯省赛C++ B组----等差数列

题目链接

解题思路:

求等差数列的公式  

a[n] = a[1] + (n-1)*d

那么 求 n 就成了   ( a[n] - a[1] / d ) + 1

要想 n 小  d 就要大   题目给出的 n项中 每个之间的差值都是 d 的倍数 所以求 差值之间的最大公约数即可

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn];
ll gcd(ll a,ll b)
{
	ll c;
	while(b>0)
	{
		c=a%b;
		a=b;
		b=c;
	}
	return a;
}
int main()
{
	int n;
	int i,j,k,x=0,y;
	cin>>n;
	for(i=1;i<=n;i++)
	  cin>>a[i];
	sort(a+1,a+n+1);
	if(a[1]==a[n])
	  cout<<n<<endl;
	else
	{
		k=a[2]-a[1];
		for(i=3;i<=n;i++)
		{
			k=gcd(k,a[i]-a[i-1]);
		}
		cout<<(a[n]-a[1])/k+1<<endl;
	}
	return 0;
}

 

 


版权声明:本文为weixin_43819762原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。