计算多个数的最大公约数

前提:

求最大公约数可以使用<algorithm>中的方法__gcd() 但是只能求两个数的最大公约数

注意:

0和a(任意数字)的最大公约数是a

理论:

实际上可以嵌套多个函数,类似的使用max(max(a,b),c);
例如:__gcd(__gcd(a,b),c)就能求得a,b,c三个数的最大公约数,设为gcd,其实这和辗转相除的原理类似(挑战程序设计竞赛114页)

证明:

假设a,b,c为一个长方体的长宽高,寻找最大的正方体(边长为gcd)能够将长方体填满。
于是正方体要先满足a,b构成的平面于是gcd1=__gcd(a,b),满足a,b的同时还要满足c,于是在gcd1的前提下gcd=__gcd(gcd1,c);
就像辗转相除通过最优数据进行假设测试计算来得到最后的数据

例题:

在这里插入图片描述
在这里插入图片描述

AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long  a[1000000],b;
int main(){
	long long n,m;
	cin>>n>>m;
	long long gcd=0;
	for(long long i=0;i<n;i++)
	{
	scanf("%lld",&a[i]);
	if(i>0){
		gcd=__gcd(gcd,a[i]-a[i-1]); 
	}
	}
	long long item=0;
	for(long long j=0;j<m;j++)
	{
		scanf("%lld",&b);
		int f=0;
		if(gcd%b==0&&item==0)item=j+1;
	}
	if(item==0)cout<<"NO";
	else cout<<"YES"<<endl<<a[0]<<" "<<item;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值