题目描述
Description
给定n(1<=n<=100)个数,从中找出尽可能多的数使得他们能够组成一个等差数列.求最长的等差数列的长度.
输入描述
Input Description
第一行是一个整数n,接下来一行包括了n个数,每个数的绝对值不超过10000000.
输出描述
Output Description
对于每个输入数据,输出你所找出的最长等差数列的长度
样例输入
Sample Input
7
3
8
4
5
6
2
2
样例输出
Sample Output
5
#include <stdio.h>
#define M 100
void swap(int *a,int *b);
void sort(int *num,int begin,int end); //快速排序
int search(int *num,int n); //搜索最长等差数列
int main(void)
{
int n=0,i=0,j=0,k=0;
int num[M]={0};
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",num+i);
}
sort(num,0,n-1);
printf("%d\n",search(num,n));
return 0;
}
int search(int *num,int n)
{
int i=0,j=0,k=0,m=0,length=0;
int max=-1,count=0;
if(n==1) max=1;
for(i=0;i<n;i++) //选取等差数列的第一项
{
for(j=i+1;j<n;j++) //等差数列的第二项,决定了公差
{
length = num[j]-num[i]; //记录公差
count = 2; //初始化为2
k = j;
m = j+1;
while(m<n) //以当前公差向后搜索,如果满足条件count++
{
if(num[m]-num[k]>length) break;
if(num[m]-num[k]==length)
{
k = m;
count++;
}
m++;
}
if(count>max) max = count; //对比最大值
}
}
return max;
}
void swap(int *a,int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
//快速排序
void sort(int *num,int begin,int end)
{
if(begin<end)
{
int i = begin+1;
int j = end;
while(i<j)
{
if(num[i]>num[begin])
{
swap(num+i,num+j);
j--;
}
else i++;
}
if(num[i]>=num[begin]) i--;
swap(num+i,num+begin);
sort(num,begin,i);
sort(num,j,end);
}
}