51Nod - 1179

给出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 }

 



posted @ 2018-07-25 10:08  谁知道你啊啊啊  阅读(132)  评论(0编辑  收藏  举报