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;
}