Problem 113: Max Gcd
Time Limit:3 Ms| Memory Limit:65 MB
Difficulty:0
Description
给一个长度为 n 的数列 {an} ,找出 max { gcd(ai , aj) }(i != j)。
Input
多组测试数据。(100组)
第 1 行 1 个数 n。(2<=n<=10^5)
接下来的 1 行有 n 个数 ai。(1<=ai<=10^5)
第 1 行 1 个数 n。(2<=n<=10^5)
接下来的 1 行有 n 个数 ai。(1<=ai<=10^5)
Output
1 行有 1 个数,max { gcd(ai , aj) }(i != j)。
Sample Input
3
1 2 4
1 2 4
Sample Output
2
代码:
#include<stdio.h>
int gcd(int a1, int a2)
{
int t,m;
if(a1 < a2) //注意不能将啊a[i]和a[j]的值在本质上交换;
{
m = a2;
a2 = a1;
a1 = m;
}
while(a2)
{
t = a2;
a2 = a1 % a2;
a1 = t;
}
return a1;
}
int max;
int main()
{
int n, a[100010], i, j;
int g;
while(scanf("%d", &n) != EOF)
{
max = -1;
for(i = 0; i < n; i++)
{
scanf("%d",&a[i]);
}
for(i = 0; i < n; i++)
{
if(a[i] <= max)//剪枝,只要两个数中的任意一个小于以求的的最大公约数,那么就不用再继续搜索;
{
continue;
}
for(j = i + 1; j < n; j++)
{
if(a[j] <= max)
{
continue;
}
g = gcd(a[i], a[j]);
if(g > max)
{
max = g;
}
}
}
printf("%d\n", max);
}
return 0;
}