数学老师给小明出了一道等差数列求和的题目。
但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数 A1,A2,⋅⋅⋅,AN。(注意 A1∼AN 并不一定是按等差数
列中的顺序给出)
输出格式
输出一个整数表示答案。
数据范围
2≤N≤100000,
0≤Ai≤109
输入样例:
5
2 6 4 10 20
输出样例:
10
样例解释
包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、18、20。
思路:
先对输入的数据排序,再求所有相邻差值A[i]-A[i-1]的最大公倍数gb,用max-min/gb+1即为项数 。但是要对常数列进行单独考虑,小编最开始时没有考虑到常数列,错了一组数据(常数列也是等差数列的一种,差值为0)
#include<iostream>
#include<stdlib.h>
using namespace std;
int A[100003];//存储输入的等差数列
int N;//表示等差数列的个数
//思路:先对输入的数据排序,再求所有相邻差值A[i]-A[i-1]的最大公倍数gb,用max-min/gb+1即为项数
//思路是对的,但是没有考虑到常数列
int compare(const void *a,const void *b);
int Count();//求出数列的个数
int main()
{
int result,t;//表示结果
cin>>N;
for(int i=0;i<N;i++) cin>>A[i];//输入
qsort(A,N,sizeof(A[0]),compare);//从小到大排序
t=Count();//t为等差数列的差值
if(t==0) cout<<N<<endl;//如果差值为0,则只能有一种情况,所有N的数是一样的
else{//如果差值不为0时的情况
result=(A[N-1]-A[0])/Count()+1;//根据差值算出等差数据的项数
cout<<result<<endl;
}
return 0;
}
int Count()
{
int Plus[N];//表示每两个数之间的差值
int i,j;
bool flag;//标志
for(i=0;i<N-1;i++){
Plus[i]=A[i+1]-A[i];//求出相邻两项的差值
if(Plus[i]==0) return 0;//此时为常数列 ,差值为0
if(Plus[i]==1) return 1;//此时差值为1,可以直接返回
}
qsort(Plus,N-1,sizeof(Plus[0]),compare);//排序,求差的最小公倍数
//Plus[0]>1;因为已经排除了常数列 和差值为1时的情况
for(i=Plus[0];i>1;i--){
flag=true;
for(j=0;j<N-1;j++){
if(Plus[j]%i!=0){//一项项判断i是否为所有差值的最小公倍数
flag=false;break;//表示i不是最小公倍数
}
}
if(flag) break;
}
return i;
}
int compare(const void *a,const void *b)
{
return (*(int*)a-*(int*)b);//从小到大排序
}