最大的最大公约数( 51nod-1179)

Posted chuixulvcao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大的最大公约数( 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.做题的时候学长有提示用暴力求解,没毛病,可为什么我只过了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 }

 

以上是关于最大的最大公约数( 51nod-1179)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1179 最大的最大公约数

51nod 1179 最大的最大公约数 (无耻的打表计数法)

51nod 1179 最大的最大公约数

51nod 1179 最大的最大公约数

最大的最大公约数( 51nod-1179)

51 Nod 1179 最大的最大公约数(筛法)