题意:
给你n个数的数组,挑两个数使得最大公约数最大,求最大的最大公约数。
解析:
求出每个数的举因子,如果数组里有两个或两个以上能够整除这个因子,那么这些因子中,最大的因子就是ans。
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int arr[N], n;
int vis[N];
inline void read(int &x) {
int flag = 0;
x = 0;
char c = getchar();
if(c == '-')
flag = 1;
while(c < '0' || c > '9') {
if(c == '-')
flag = 1;
c = getchar();
}
while(c >= '0' && c <= '9')
x = x * 10 + c - '0', c = getchar();
if(flag) x = -x;
}
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a%b);
}
int main() {
int T, cas = 1;
scanf("%d", &T);
while(T--) {
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for(int i = 0; i < n; i++) {
read(arr[i]);
}
sort(arr, arr+n);
for(int i = 0; i < n; i++) {
int lim = (int)sqrt((double)arr[i]);
for(int j = 1; j <= lim; j++) {
if(arr[i] % j == 0) {
vis[j]++;
vis[arr[i]/j]++;
}
}
if(lim*lim == arr[i]) vis[lim]--;
}
int ans;
for(int i = N; i >= 1; i--) {
if(vis[i] >= 2) {
ans = i;
break;
}
}
printf("Case #%d: %d\n", cas++, ans);
}
return 0;
}