• 1179 最大的最大公约数(51NOD四级算法)


    1179 最大的最大公约数(51NOD四级算法)

    题目来源: SGU
    基准时间限制: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 最大的最大公约数
    两个数的公约数说明两个数都含有这个约数,我们可以利用这个性质。打一个约数表,
    从最大的约数开始往前枚举,碰到约数个数大于等于2,直接输出即可。 
    
    即:先求出 每一个数的约数 并用数组统计该约数出现的次数  , 出现次数大于等于2 说明是 公约数 , 
    从最大的约数向前枚举找到第一个出现次数大于等于2 的约数,该约数就是数组中的最大约数 
    */
    
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <iostream>
    #include <algorithm>
    using namespace std ; 
    
    #define maxn 1000000 + 10 
    #define LL long long 
    int num[maxn] ; 
    int num1 ; 
    
    int  main(){
        int n ; 
        while(~scanf("%d" , &n)){
            int max_num = INT_MIN ; 
            memset(num , 0 , sizeof(num)) ; 
            for(int i=1 ; i<= n ; i++){
                scanf("%d" , &num1) ; 
                // 注意此处 j 从 1 开始 不要从 2 开始 
                // 因为是要求 最大的最大的公约数  会存在最大公约数为 1 的情况 
                // (几个互质的数的最大公约数为 1 )  
                for(int j=1 ; j<= sqrt(num1) ; j++){
                    if(num1% j == 0 ){
                        num[j] ++ ; 
                        num[num1/j]++ ; 
                        max_num = max(max_num , j) ; 
                        max_num = max(max_num , num1 /j) ; 
                    }
                }            
            }
            for(int i=max_num ; i>=1 ; i--){
                if(num[i] >=2){
                    printf("%d
    " , i) ; 
                    break ; 
                }
            }
        }    
        return 0 ; 
    } 
    /*大佬的筛法
    #include <stdio.h>  
    #include <string.h>  
    #define maxn 1000000+10  
    int num[maxn];  
    int book[maxn];  
    int n,m;  
    int main()  
    {  
        while(~scanf("%d",&n))  
        {  
            memset(num,0,sizeof(num));  
            int max1=0,ans,k=1;  
            for(int i=0; i<n; i++)  
            {  
                scanf("%d",&m);  
                book[m]++;  
                if(m>max1)  
                    max1=m;  
            }  
            for(int i=max1; i>=1; i--)  
            {  
                ans=0;  
                for(int j=i; j<=max1; j+=i)  
                {  
                    ans+=book[j];  
                    if(ans>=2)  
                    {  
                        k=i;  
                        break;  
                    }  
                }  
                if(ans>=2)  
                    break;  
            }  
            printf("%d
    ",k);  
        }  
        return 0;  
    }  
    
    
    */
  • 相关阅读:
    调整浏览器兼容性的利器条件判断注释器
    Automatic uninstall IE9 and roll back to IE8
    How to use cmd with C#
    [转]在设计和执行测试用例的时候的几点心得和经验
    Move all files in subfolders to another folder using c#
    数据驱动单元测试实例
    测试web开源项目时如何收集代码覆盖率
    2013春节期间玩CentOS 6.3记录
    当使用ckeditor控件时,需要校验输入内容是否为空的一种解决办法(转帖)
    Enterprise Architect 8.0 注册码
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7553725.html
Copyright © 2020-2023  润新知