51Nod-1179 最大的最大公约数【暴力】

来源:互联网 发布:uc2监控软件账号注册 编辑:程序博客网 时间:2024/04/29 21:50

1179 最大的最大公约数

基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
给出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
输出两两之间最大公约数的最大值。
Input示例
49152516
Output示例
5

问题链接:1179 最大的最大公约数

问题分析

按照题意,对于给定的整数两两求其最大公约数是一种暴力,然而时间上不可接受,因为其计算复杂度是O(n*n)。

换一种暴力也许计算复杂度会有所降低,不会随着N的增大而增大。这就是从最大的s[i]<=1000000开始试探,逐步减小找到最大的最大公约数。

上述过程中,主要是看各个数的倍数(包括倍数为1的)是否与之相等,有两个相等的则找到了所求的答案。

程序说明:(略)

题记:两权相害取其轻。

参考链接:(略)


AC的C++程序如下:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int N = 1000000;int siflag[N+1];int main(){    int n, i, si, maxsi;    memset(siflag, 0, sizeof(siflag));    scanf("%d", &n);    maxsi = 0;    for(i=1; i<=n; i++) {        scanf("%d", &si);        siflag[si]++;        maxsi = max(maxsi, si);    }    for(i=maxsi; i>=1; i--) {        int count = 0;        for(int j=i; j<=maxsi; j+=i) {            count += siflag[j];            if(count >= 2)                break;        }        if(count >= 2)            break;    }    printf("%d\n", i);    return 0;}