51Nod-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\n", i);
return 0;
}
浙公网安备 33010602011771号