joshua分享 简单题:先打素数表,再从最小值的那个开始从最大素数开始判断
#include <bits/stdc++.h>
using namespace std;
int main(void) {
int n, i, j, tMin = 0x7fffffff;
vector<int> chart(50001, 1);
vector<int> prim;
cin >> n;
vector<vector<int>> arr(n, vector<int>(2, 0));
for(i = 0; i < n; i++) {
cin >> arr[i][0] >> arr[i][1];
// 找出n对数据中的最小值
tMin = min(tMin, min(arr[i][0], arr[i][1]));
}
// 打表,找出<=50000的的所有素数,并依次放到prim数组中
for(chart[1] = 0, i = 2; i < chart.size(); i++) {
if(chart[i]) {
prim.push_back(i); // 依次把素数放进去
for(j = i*i; j < chart.size(); j += i)
chart[j] = 0;
}
}
// 初始化,从最大可能满足条件的素数开始递减
for(i = 0; i < prim.size(); i++)
if(prim[i] >= tMin) break;
// 开始查找
while(i >= 0) {
for(j = 0; j < n; j++) {
if(arr[j][0] % prim[i] == 0 || arr[j][1] % prim[i] == 0);
else break;
}
if(j == n) break;
i--;
}
if(j == n) cout << prim[i] << endl;
else cout << -1 << endl;
return 0;
}
京公网安备 11010502036488号