1. 程式人生 > >51Nod-1179(思維、暴力)

51Nod-1179(思維、暴力)

/*
    51Nod-1179
    給出N個正整數,找出N個數兩兩之間最大公約數的最大值。
    例如:N = 4,4個數為:9 15 25 16,兩兩之間最大公約數的最大值是15同25的最大公約數5。
    
    最大的最大公約數
    解題思路大概就是
    先建立一個足夠大的陣列,每輸入一個數就使對應的元素++
    如 輸入 15 則 a[15]++;
    然後用一個二重迴圈
    外層i從MAX到1每次--
    內層j從i到MAX每次+i
    再定義一個變數tmp+=a[j]
    當這個tmp>=2時跳出迴圈,輸出i
    因為內層是+i,代表是i的倍數
    當tmp能夠加上一個不為0的數,說明原本輸入是有這個數,且這個數是當時i的倍數
    而tmp>=2則說明,有兩個數都是i的倍數
    又因為是從MAX減小的,代表肯定是所有裡面最大的
*/
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define mod 1000000007
#define MAX 1000005
#define ll long long
#define PI acos(-1)
using namespace std;


int a[MAX];
int main()
{
    memset(a,0,sizeof(a));
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int res;
        cin>>res;
        a[res]++;
    }
    int ans;
    for(int i=MAX;i>=1;i--)
    {
        int tmp=0;
        for(int j=i;j<=MAX;j=j+i)
        {
            tmp+=a[j];
            if(tmp>=2)
                break;
        }
        if(tmp>=2)
        {
            ans=i;
            break;
        }
    }
    cout<<ans<<endl;
    return 0;
}