蓝桥杯—等差数列(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
#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;
}