简单求解“多数字(>=3)”的最小公倍数&最大公因数(附核心代码模板)

简单求解“多数字(>=3)”最小公倍数&最大公因数(附核心代码模板)

相关知识

符号说明GCD(Greatest Common Divisor),是最大公因数的英文缩写简称;同理,LCM(Least Common Multiple),是最小公倍数的英文缩写简称。

1、求两个数的最大公倍数​
相关公式

​​  由以上公式可知,对于已知的两个数A和B,要求他们的最大公因数和最小公倍数,由于A×B已知,我们只需要求出其中GCD或LCM其中的任意一个,即可将另外一个求出来。
​​​  所以现在的问题就变成了,怎么求这两者其中的任意一个呢?

相关函数

​​​  C++中有一个叫做==__gcd(A,B)的内置函数,虽然名字中包含gcd,但其实并不是求GCD,而是求LCM的。这个函数已经被包括在万能头文件#include<bits/stdc++.h>中,无需额外的声明。传入的数据类型应是整形
​​​  有了这个求LCM的函数,我们就可以很迅速地求出来两个数的LCM,再利用2中的相关公式,即可求出两个数的GCD。GCD&LCM两数都搞定~~

2、求多个数(>2)的最大公倍数


​​​  如上图所示,求解思路就是递推求解。假设求x1到xn的GCD,根据以上思路,我们有以下代码。

GCD=1; //前面所有数的GCD,初值为1 
for(int i=1;i<n;i++)GCD=GCD(前面所有数的GCD,x[i]); //递推更新GCD 
3、GCD&LCM核心代码模板

​​​  本质上来说,两数的情况也是多数的一种,因此我们在这里给出的模板,依然按照更广泛、普适性更强求多数的GCD这一问题来设计,如下所示:

	gcd=1; // 目前前面所有数的GCD,初始值为1 
	for(int i=0;i<n;i++)gcd=gcd*x[i]/(__gcd(gcd,x[i])); // 利用GCD公式,不断目前前面所有数的更新GCD 
	cout<<gcd<<endl; // 最后更新的GCD,即为前n个数的GCD 
相关题目
1、求两数的最小公倍数

参考思路

​​​  先利用==__gcd(A,B)==求出LCM,再利用求出GCD。

参考AC代码

​​​  本题的参考代码本身就可以作为代码模板,如下所示。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int A,B;
	while(cin>>A>>B){
		cout<<A*B/(__gcd(A,B))<<endl; 
	}
	return 0;
}
2、求多数(>2)的最小公倍数

在这里插入图片描述

参考思路

​​​  先求前2个数的gcd,再求前3个数的gcd,以此类推,最终即可求出前n个数的gcd。

参考AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll A,B,x[35],t,c,gcd;
	cin>>t; 
	while(t--){
		cin>>c;
		memset(x,0,sizeof(x));
			for(int i=0;i<c;i++)cin>>x[i];
		gcd=1;
			for(int i=0;i<c;i++)gcd=gcd*x[i]/(__gcd(gcd,x[i]));
		cout<<gcd<<endl; 
	}
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值