蓝桥杯等差数列

数学老师给小明出了一道等差数列求和的题目。

但是粗心的小明忘记了一部分的数列,只记得其中 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);//从小到大排序 
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值