zoukankan      html  css  js  c++  java
  • 51Nod-1179 最大的最大公约数【暴力】

    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示例
    4
    9
    15
    25
    16
    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
    ", i);
    
        return 0;
    }







  • 相关阅读:
    大数据概述
    语法分析-代码
    语法分析-C语言程序
    Hadoop综合大作业
    hive基本操作与应用
    理解MapReduce计算构架
    熟悉HBase基本操作
    爬虫大作业
    熟悉常用的HDFS操作
    数据结构化与保存
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563725.html
Copyright © 2011-2022 走看看