最大的最大公约数( 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

扫描二维码关注公众号,回复: 1480322 查看本文章

25

16

Sample Output

5

思路:

1.做题的时候学长有提示用暴力求解,没毛病,可为什么我只过了1组数据啊QWQ,然后才发现这是一个有艺术的暴力orz。

2.代码是参照了别个的(完全一样好伐),还是很好理解的,就是开一个数组用下标及数组所表示的数来表示输入时出现的数极其个数。然后从最大的数开始倒着走一遍,然后每个数中,又从当前数(及外循环的数)走一遍到最大数,期间用一个temp(初始为0)判断有没有外循环的数的倍数出现。出现两次极其以上及找到了最大公因数(外循环的数),因为是从最大开始循环,所以只要找到即可。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<cstring>
 7 #include<string>
 8 using namespace std;
 9 const int maxn=1000000;
10 int a[maxn];
11 int main()
12 {
13     int n;
14     cin>>n;
15     memset(a,0,sizeof(a));
16     for(int i=1;i<=n;i++)
17     {
18         int x;
19         cin>>x;
20         a[x]++;
21     }
22     int ans;
23     for(int i=maxn;i>=1;i--)
24     {
25         int temp=0;
26         for(int j=i;j<maxn;j+=i)
27         {
28             temp+=a[j];
29             if(temp>=2)
30             {
31                 break;
32             }
33         }
34         if(temp>=2)
35         {
36             ans=i;
37             break;
38         }
39     }
40     cout<<ans<<endl;
41     return 0;
42 }

猜你喜欢

转载自www.cnblogs.com/chuixulvcao/p/9142670.html