蓝桥杯等差数列
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T2735
题目思维还是很不好想的,但是很经典
开始用普通的等差数列肯定是错了;
所以开始优化:
为了保证公差的正确性,应该是两两进行取最大公约数;
这样的意思是:2,4,8(假设公差是2)
但是中间还有6;
所以说这样就保证了这一运算的正确性。
具体情况代码已标注,这个题还是很值得重视的:
#include<bits/stdc++.h> using namespace std; int n; int a[100010]; int d;//公差 int ans; int gcd(int a,int b)//gcd公约数函数 { return b==0?a:gcd(b,a%b); } int main() { ios::sync_with_stdio(false); cin>>n; for(register int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n);//先排序 for(register int i=2;i<=n;i++) { int temp=a[i]-a[i-1];//两两取最大公约数,这是因为2,4,8,但是按理说中间还有6,所以两两取公约数是为了保证公差d的正确性 d=gcd(d,temp); } if(d==0)//如果公差是0,那就只有n个 ans=n; else ans=(a[n]-a[1])/d+1;//等差数列公式 cout<<ans<<endl; return 0; }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16046958.html