http://www.51nod.com/Challenge/Problem.html#problemId=1179
这道题挺有意思,让求最大的两两最大公约数,很显然暴力直接做复杂度太高。可以利用试除法,枚举每一个数的因子,如果某个因子出现超过了两次,就可以进行判断,因为题目要求两两。。。最大公约数一定是某个数的因子。
#include<iostream>
#include<algorithm>
using namespace std;
int cnt[50005],ans=-0x3f;
int k=0;
void solve(int val)
{
for(int i=1;i*i<=val;i++)
{
if(val%i==0)
{
cnt[i]++;
if(cnt[i]>=2) ans=max(ans,i);
if(i*i!=val) {cnt[val/i]++;if(cnt[val/i]>=2) ans=max(ans,val/i);}
}
}
}
int main(void)
{
int n,x;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&x);
solve(x);
}
cout<<ans;
}