求最大公约数和最小公倍数 最简手写加STL

求最大公约数和最小公倍数 手写加STL

求最大公约数:
原理:根据算数基本定理,任何一个正整数 N,都可以拆分成若干个素数的乘积:
N=pow(2,a1) x pow(3,a2) x pow(5,a3)…
那么欲求a和b的最大公倍数c,就相当于:
a=pow(2,a1) x pow(3,a2) x pow(5,a3)…
b=pow(2,b1) x pow(3,b2) x pow(5,b3)…
c=pow(2,min(a1,b1)) x pow(3,min(a2,b2)) x pow(5,min(a3,b3))…
上述是求最公约数的基本原理,但在编程中很难实现。(虽然在求最大公约数的时候用不到,但可以用来理解怎么求最小公倍数,不要以为我在说废话哦
为了优化,我们提出了欧几里得求最大公约数:
欧几里得算法实现步骤
上面是我之前写的一篇演示过程的文章,但其代码不够优化,下面给出手写最简模板

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
	if(a<b)swap(a,b);
	return b?gcd(b,a%b):a;
}
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<gcd(a,b)<<endl;
	return 0;
}

然而再algorithm中有许多有用的函数库,,其中__gcd(a,b)就是可以用于求最大公约数的函数。
代码演示:

int t=__gcd(a,b);

求最大公倍数:
在上面聊过求最大公约数的原理,这里聊聊求最小公倍数的原理:
根据算数基本定理:
a=pow(2,a1) x pow(3,a2) x pow(5,a3)…
b=pow(2,b1) x pow(3,b2) x pow(5,b3)…
设最小公倍数为 d ,那么:
d=pow(2,max(a1,b1)) x pow(3,max(a2,b2)) x pow(5,max(a3,b3))…
将 d 和 c 进行对比,不难发现 d x c=a x b
所以理所应当的可以推出:
最小公倍数 lcm(a,b)=a*b/gcd(a,b)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页