最大的最大公约数

来源:互联网 发布:java工程师职业规划 编辑:程序博客网 时间:2024/06/07 03:07
给出N个正整数,找出N个数两两之间最大公约数的最大值。例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5。
Input
第1行:一个数N,表示输入正整数的数量。(2 <= N <= 50000) 
第2 - N + 1行:每行1个数,对应输入的正整数.(1 <= S[i] <= 1000000)
Output
输出两两之间最大公约数的最大值。
Sample Input
49152516
Sample Output

5

思路:把输入的数的位置标为1,其余为0.

一个数如果是他的公约数,那么公约数按倍数增长,总会达到他的位置的1,从而加起来。

同理,如果有sum=2,代表着这个数,是他们的公约数。


代码如下:

#include <iostream>#include <cstdlib>#include <cstring>using namespace std;int cnt[1000001];int main(){    int N;    int MAX = 0;    int num;    while (cin >> N)    {        MAX = 0;        memset(cnt,0,sizeof(cnt));        for (int i = 0; i < N; ++ i)        {            cin >> num;            ++cnt[num];            if (num > MAX)            {                MAX = num;            }        }        for (int i = MAX; i >= 1; -- i)        {            int sum = 0;            ///如果i是最大公约数,那么i*k,就会等于n、            ///当n数目达到2的时候,就退出,求出了答案。            for (int j = i; j <= MAX; j+= i)            {                sum += cnt[j];                if (sum >= 2)                {                    break;                }            }            if (sum >= 2)            {                cout << i << endl;                return 0;            }        }    }    return 0;}