给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= Sii <= 1000000)Output输出两两之间最大公约数的最大值。Sample Input
4 9 15 25 16
Sample Output
5
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <iomanip> 6 #include <string> 7 #include <sstream> 8 #include <algorithm> 9 #include <stack> 10 #include <queue> 11 #include <set> 12 #include <map> 13 14 using namespace std; 15 16 typedef long long LL; 17 const int INF = 0x3f3f3f3f; 18 const int MAXN = 1000005; 19 const int MOD = 1e9 + 7; 20 21 #define MemI(x) memset(x, -1, sizeof(x)) 22 #define Mem0(x) memset(x, 0, sizeof(x)) 23 #define MemM(x) memset(x, 0x3f, sizeof(x)); 24 25 //这解法的时间复杂的不会算,因为最坏情况可能是要考虑各个数互质 26 //先算出所有数中最大的数 mx ,然后枚举 mx 到 1 的所有数作为公约数 27 int num[MAXN]; 28 int main() 29 { 30 Mem0(num); 31 int n, t; 32 cin >> n; 33 int i, j, mx = 0; 34 for(i = 0;i < n;++i) 35 { 36 cin >> t; 37 num[t]++; 38 mx = max(t, mx); 39 } 40 int flag = 0; 41 for(i = mx;i > 0 && flag < 2;--i) 42 { 43 flag = 0; 44 // j 表示公约数的倍数 45 for(j = i;j <= mx && flag < 2;j += i) 46 flag += num[j]; 47 } 48 //这里注意上面循环跳出 flag 时,是进行过 --i 的 49 cout << i + 1<< endl; 50 return 0; 51 }