C++ 数论---最大公约数 最小公倍数

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]));
        }

猜你喜欢

转载自blog.csdn.net/weixin_44916213/article/details/113145314