基准时间限制: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
问题链接:
问题分析:
按照题意,对于给定的整数两两求其最大公约数是一种暴力,然而时间上不可接受,因为其计算复杂度是O(n*n)。
换一种暴力也许计算复杂度会有所降低,不会随着N的增大而增大。这就是从最大的s[i]<=1000000开始试探,逐步减小找到最大的最大公约数。
上述过程中,主要是看各个数的倍数(包括倍数为1的)是否与之相等,有两个相等的则找到了所求的答案。
程序说明:(略)题记:两权相害取其轻。
参考链接:(略)AC的C++程序如下:
#include#include #include 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;}