【第十届蓝桥杯省赛c/c++B组真题解析】8.等差数列

  • 问题描述
    【第十届蓝桥杯省赛c/c++B组真题解析】8.等差数列_第1张图片
    样式输出
    10
  • 解题方法(排序,最小公约数)
    排序输入的数列,每相邻两项的差进行排序,求全部差的最大公约数为等差数列的公差,根据公差算出最少有多少项
  • 代码展示
#include 
using namespace std; 

int gcd(int a,int b){
     
	return !b ? a : gcd(b,a%b);
} 

int a[100001];
int b[100000];
int main(){
     
	int n,i,j,max_y,z,min_x;
	//输入 
	scanf("%d",&n);
	for(i=0;i<n;i++){
     
		scanf("%d",&a[i]);
	}
	//排序,各项之间的最大公约数
	//初始数列排序 
	//a[0]到a[n-1]排序并返回到a中 
	sort(a,a+n);
	//求相邻数列的差 
	for(j=1;j<n;j++){
     
		b[j-1]=a[j]-a[j-1];
	}
	//差排序 
	sort(b,b+n-1);
	//排完序差的最大公约数----公差 
	max_y=gcd(b[0],b[1]);
	for(z=2;z<n-1;z++){
     
		max_y=gcd(max_y,b[z]);
	}
	//求出最短完整等差数列 
	min_x=(a[n-1]-a[0])/max_y+1;
	if(max_y==0){
     
		printf("%d",n);
	} else{
     
		printf("%d",min_x);
	}
	
	return 0;	
	 
} 
	 
} 
  • 注意事项
    1.最大公约数和最小公倍数(补充)
    最大公约数的代码(记忆):
int gcd(int a,int b){
     
	return !b ? a : gcd(b,a%b);
} 

最小公倍数:
设上面得到的最大公约数为d
则最小公倍数为a/d*b

2.排序sort
sort(首元素地址,尾元素的下一个地址)

//a[0]到a[n-1]排序并返回到a中 
	sort(a,a+n);

你可能感兴趣的:(蓝桥,算法)