最大公约数
今天是国庆节, 小(Z)为了给祖国庆祝生日拿来了(n)个数字:(a_1,a_2…a_n)。
求 (max){(gcd(a_i,a_j))} (( i!=j ))Input
第一行一个整数 (n)。
之后一行 (n) 个数, 表示 (a_1,a_2…a_n)。Output
输出一个整数表示答案。
Example
输入 #1
(3)
(4) (3) (6)输出 #1
(3)
Scoring
对于 30%的数据, 满足 (n≤1000);
对于 100%的数据, 满足 (n≤10000), (1≤a_i≤10^6);
并不是难题...但是为了纪念一下暑期集训第一道一遍AC的题(其实是想摸鱼)
所以就来写题解了
看完题面:哦哦哦我会了我可以拿三十分快去下一题(bus
然后努力想了想,辗转相除法咋写来着
三十分暴力代码——
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10005], ans = 1;
int gcd(int a, int b)
{
if(b==0)return a;
return gcd(b, a%b);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i < n; i++)
for(int j = i + 1; j <= n; j++)
ans = max(ans, gcd(a[i], a[j]));
printf("%d", ans);
return 0;
}
然后敲完二三两题的暴力又回来想了想
对于 100%的数据, 满足 (n≤10000), (1≤a_i≤10^6);
(1≤a_i≤10^6);
要素察觉
然后一通脑内瞎搞把正解写出来了
详细做法见代码注释
//:D
#include<bits/stdc++.h>
using namespace std;
int n, maxn = 1;
int a[10005], f[100005];//f[i]=p 表示在这n个数中,p个数的约数中有i
int main()
{
//freopen("gcd.in", "r", stdin);
//freopen("gcd.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
maxn = max(maxn, a[i]);
for (int j = 1; j * j <= a[i]; j++)
if (a[i] % j == 0){
if(j * j != a[i])f[j]++, f[a[i] / j]++;//统计——
else f[j]++;
}
}
for (int i = maxn; i >= 1; i--)
if (f[i] >= 2){//从大到小枚举到第一个是多个数因数的数(好绕
printf("%d", i);
return 0;
}
return 0;
}
液,做完了