最大的最大的公约数

给出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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丞啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值