蓝桥杯—等差数列(C语言解法)

题目描述

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N 个整数。
现在给出这N 个整数,小明想知道包含这N 个整数的最短的等差数列有几项?

输入描述

输入的第一行包含一个整数N。
第二行包含N 个整数A1.A2,..., AN。(注意A1<=AN 并不一定是按等差数列中的顺序给出)
2<=N<=100000,0<=Ai<=10^9

输出描述

输出一个整数表示答案。

输入输出样例

输入

5
2 6 4 10 20

输出

10

思路

!!再回顾时,发现思路错了,不应该直接求相邻两项的公约数,如果这样的话思路是错的,比如3 5 7 最大公差应该是2,但是按照前述思路求最大公差为1,所以正确思路应该是求出各相邻两项的差,再求相邻两项差的公约数

  1. 第一遍做的时候,我的思路是要求出公差,就要求出相邻两项的公约数,但是没有通过全部用例,应该是超时,后来改变的求公约数的项的大小,求的是相邻两项的差与后两项的差的最大公约数
  2. 自定义了求公约数的函数,用的是辗转相除法(如果较大数能整除较小的数,则较小的数为最大公约数,否则将较小的数赋值给较大的数,余数赋值给较小的数,注意需要一个中间变量)
  3. 在读入数据时,找到最大的数与最小的数,方便后续求项数
  4. 如果最大的数等于最小的数,则项数与输入的项数相同,不必求公差
  5. 项数等于最大值与最小值的差除公差在加1
#include<stdio.h>
int gys(int a,int b){//求最大公约数函数
	int temp;
	while(a%b != 0){
		temp=b;
		b=a%b;
		a=temp;
	}
	return b;
}
int main(){
	int count,gongcha;
	long int max=-1,min=9999;
	long int data[100000];
	scanf("%d",&count);
	for(int i=0;i<count;i++){
		scanf("%ld",&data[i]);
		if(max<data[i])max=data[i];
		if(min>data[i])min=data[i];//在读入数据时同时求出最值
	}
	if(max==min)printf("%d",count);
	else{
		if(data[0]>data[1])gongcha=data[0]-data[1];//将初始公差设为第一项与第二项的差(注意要为判断大小,取正值)
		else gongcha=data[1]-data[0];
		for(int i=2;i<count;i++){
			if(data[i]>data[i-1])gongcha=gys(gongcha,data[i]-data[i-1]);
			else gongcha=gys(gongcha,data[i-1]-data[i]);
		}
		printf("%ld",(max-min)/gongcha+1);
	}
	return 0;
}
posted @ 2022-01-25 16:18  两颗不一样的西柚  阅读(809)  评论(0)    收藏  举报