题目来源: SGU
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Input示例
4
9
15
25
16
Output示例
5
题解:求给出的数中两两之间最大公约数的最大值,如果暴力求出两两之间的最大公约数再进行比较一定会超时。逆向思考,假设我们已经找到问题的解了,只需去判断它是否是给出的数中的某几个数的最大公约数,我们从给出的数的最大值开始枚举,不断减一,直到至少有两个数是它的倍数,程序用a[i]记录给出的数中i出现的次数,
AC的C++程序:
#include<iostream>
using namespace std;
const int N=1000000;
int a[N+1];
int main()
{
int n,x,end=1,ans=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
a[x]++;
end=max(end,x);
}
for(int j=end;j>=1;j--){//从给出的数中的最大值开始枚举,不断减一
int cnt=0;
for(int i=j;i<=N;i+=j){
cnt+=a[i];
if(cnt>=2)
break;
}
if(cnt>=2){//如果有至少两个数是j的倍数,说明j就是所求的最大公约数
ans=j;
break;
}
}
cout<<ans<<endl;
return 0;
}