如何判断数组任意几个数成等差
如何判断数组任意几个数成等差,比如12579111214中的57911,或者13467810121315中的1471013,虽然678也成等差,但要求数目不少于4个,可以...
如何判断数组任意几个数成等差,比如1 2 5 7 9 11 12 14中的5 7 9 11,或者1 3 4 6 7 8 10 12 13 15中的1 4 7 10 13,虽然6 7 8也成等差,但要求数目不少于4个,可以相邻或相间,间隔不限,可以有个思路,或者算法都可以,能有一个程序代码就更好了,谢谢各位了
展开
1个回答
展开全部
感觉条件欠缺很多,不如暴力枚举吧~
就是枚举这个等差数列的起点以及公差,构造一个等差数列
然后看这个等差数列的每个数在原数列中是否存在,
若找到该等差数列的前至少4项,则表明找到~~
附上小弟代码~
假定了数列大小最大为100。。。
#include "stdio.h"
#include "string.h"
#include <algorithm>
using namespace std;
int a[100],n;
bool bs(int x)
{
int low,high,mid;
low=0;high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
return true;
if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return false;
}
int main()
{
int i,j,k,k2;
while(scanf("%d",&n)>0)
{
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
sort(a,a+n);
for(i=0;i<n;i++)
{
for(j=1;a[i]+j*3<=a[n-1];j++)
{
for(k=0;;k++)
{
if(!bs(a[i]+k*j))
break;
}
if(k>3)
{
for(k2=0;k2<k;k2++)
{
printf("%d ",a[i]+k2*j);
}
printf("\n");
}
}
}
}
return 0;
}
就是枚举这个等差数列的起点以及公差,构造一个等差数列
然后看这个等差数列的每个数在原数列中是否存在,
若找到该等差数列的前至少4项,则表明找到~~
附上小弟代码~
假定了数列大小最大为100。。。
#include "stdio.h"
#include "string.h"
#include <algorithm>
using namespace std;
int a[100],n;
bool bs(int x)
{
int low,high,mid;
low=0;high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
return true;
if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return false;
}
int main()
{
int i,j,k,k2;
while(scanf("%d",&n)>0)
{
for(i=0;i<n;i++)
{
scanf("%d",a+i);
}
sort(a,a+n);
for(i=0;i<n;i++)
{
for(j=1;a[i]+j*3<=a[n-1];j++)
{
for(k=0;;k++)
{
if(!bs(a[i]+k*j))
break;
}
if(k>3)
{
for(k2=0;k2<k;k2++)
{
printf("%d ",a[i]+k2*j);
}
printf("\n");
}
}
}
}
return 0;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询