给出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
n^2*1e6的方法就不阐述了,应该每个人都想的到,然而面对庞大的时间复杂度,我们需要想一种更为优质的解来解决这个问题。作为一个公约数,首先,它肯定是数列中两个或以上数的约数(这点很重要,如果没有这一点为前提,后面的解题就无法展开),也就是说,针对每一个数x,我们可以暴力枚举出它的约数,时间复杂度为O(x),再从1e6这个最大的约数开始找,找到第一个出现过两次及以上的约数,则它一定是这串数列中最大的最大公约数。具体实现方法请看代码。
#include
#include
using namespace std;
int f[1000005];
int main(){
int n,i;
scanf("%d",&n);
for (i=1;i<=n;i++){
int x;
scanf("%d",&x);
int y=sqrt(x);
for (int j=1;j<=y;j++){
if (x%j==0){
int k=x/j;
f[j]++;f[k]++;
}
}
}
for(i=1000000;i>=1;i--){
if (f[i]>=2) break;
}
printf("%d\n",i);
}