1.两个数的最大公约数
(1)__gcd(x,y)函数
ps:x y不能为浮点数
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
cout<<__gcd(a,b)<<endl;
}
(2)辗转相除法,又称为欧几里得算法。(如果其中一个数为0,则另一个数为最大公约数)
例:10和35
gcd(10,35) = gcd(35,10) = gcd(10,5) = gcd(5,0) = 5
1、10/35,余数为10 得到(35,10)
2、35/10,余数为5 得到(10,5)
3、10/5,余数为0 得到(5,0)
4、最后得到最大公约数 5
int gcd(int n, int m)//辗转相除法
{
if (n<m)//利用两个变量进行值对换
{
n=m+n;
m=n-m;
n=n-m;
}
if (m==0) return n;
return gcd(m,n%m);
}
2.多个值的最大公约数
该gcd应该先求前两个数的gcd,然后再将gcd和下一个数求gcd和这个数的gcd,听起来有点绕口,简言之就是不断用gcd和后面的数进行求公约数运算,直至进行到最后一个数得到的gcd便是这组数的gcd
int max_common_divisor(int several[], int n)
{
int a=several[0];
int b=several[1];
int c=gcd(a,b);
int i;
for (i=2; i<n; i++)
{
c=gcd(c,several[i]);
}
return c;
}
3.两个数的最小公倍数
int lcm(int a, int b) {
int gcd(int a, int b);
int temp;
temp = gcd(a, b);
return(a * b / temp);
}
4.多个数的最小公倍数
类似于求多个数的最大公约数
for(int i=0;i<n;i++)//n 数组大小 k 最小公倍数 a数据数组
{
k=lcm(k,a[i],gcd(k,a[i]));
}