#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
if(a%b==0) return b;
return gcd(b,a%b);
}
int main()
{
int n;
while(cin>>n)
{
vector<int>a(n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a.begin(),a.end());
int k=gcd(a[n-1],a[0]);
cout<<a[0]<<" "<<a[n-1]<<" "<<k;
cout<<'\n';
}
return 0;
}
这一题我们要用到gcd函数,这函数在一些版本里可以直接引用
以下是我知道的两种直接引用方式:
int k=_gcd(a,b);
int k=gcd(a,b);
本题中我们直接模拟了
int gcd(int a,int b)
{
if(a%b==0) return b;
return gcd(b,a%b);
}
方法原理:
数学基础:欧几里得算法,它是求最大公约数的经典算法。
a模b有余数时我们用较小的数模上它的余数直到余数为零,此时的b就是我们要找的最大公约数。
对应数学解释:
设d为最大公约数,则d可以整除a也可以整除b,余数r=(a-b*k)(b为较小的数)//这里我们回忆一下结论:以余数为新b,b为新a,找到的最终余数为零时即b=0得到新a为最终答案。当找到那个a%r(新)==0的情况r就是答案//存在m,n使得a=d*m,b=d*n;
r=(d*m-d*n*k)=d(m-nk);d时b和r的公约数//利用这个性质,我们可以反复更新a,b//因为r严格小于b,所以数组严格递减,一定有r=0的情况,那我们找的b就是最大公约数
可能出现问题:
没有考虑多组数据情况,while(cin>>n);
细节vector<int>a(n)//用小括号初始化数组,并且可以动态初始化数组大小。
gcd中a,b大小顺序。



京公网安备 11010502036488号