给出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
输出两两之间最大公约数的最大值。
Sample Input
4 9 15 25 16
Sample Output
5
#include <stdio.h>
int main() {
long long N,a[1000],i=0,j=0,k=0,sum=0,num=0;
long long store[80],store2[80],max=0,l=0,q=0;
long long max2,y,m;
//a数组存每次输入的数,store1存两两数的所有的公约数。
//store2存两两公约数的最大的,max为找两两最大公约数的过度变量
//i,j,k,m,l为数组的下标变量。sum,num为 统计两两数的所有的公约数的数量 ,
//q统计store2的长度
scanf("%lld",&N);
y=N;//因为N会在赋值的时候改变,y存N的值
while(N) {
scanf("%lld",&a[i]);
N--;
i++;
}
//功能
for(i=0; i<y-1; i++) {
k=0;
sum=0;
num=0;
//找a[i]的所有的约数,用store来储存
for(j=1; j<=a[i]; j++) {
if(a[i]%j==0) {
store[k]=j;
sum++;
k++;
}
}
//找a[i+1]所有的公约数 ,注意a[i]和a[i+1]的所有的公约数都储存在store这一个数组。
//因此要用num和sum统计他们的长度。
for(j=1; j<=a[i+1]; j++) {
if(a[i+1]%j==0) {
store[k]=j;
num++;
k++;
}
}
//用max来储存两者的最大的公约数,通过遍历找到最后相同的数即可 ,即最大的公约数。
for(m=0; m<sum; m++) {
for(j=sum; j<(num+sum); j++) {
if(store[m]==store[j]) {
max=store[m];
break;
}
}
}
store2[l]=max;
q++;
l++;
//k=0;sum=0;num=0;store储存的公约数只是为啦得到最大的公约数,因次为存下两个数的公约数
//要让涉及和存公约数有关的变量变0重新开始。
}
//接下来就是将储存在store2数组的两两最大公约数的公约数进行比较,找最大值即可。
max2=store2[0];//max2为最后的结果值。
for(i=0; i<q; i++) {
if(store2[i]>=max2) {
max2=store2[i];
}
}
printf("%lld",max2);
return 0;
}