• 51Nod


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


    现在所有的不幸都是以前不努力造成的。。。
  • 相关阅读:
    团队作业(三)
    第四章学习笔记
    2.3.1测试
    缓冲区溢出漏洞实验
    第三章学习笔记
    团队作业(二)
    第十一章学习笔记
    第7,8章自学笔记
    stat命令实现—mystat
    第五章学习笔记
  • 原文地址:https://www.cnblogs.com/shuizhidao/p/9364357.html
Copyright © 2020-2023  润新知