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; } */