c/c++语言求最大公约数、最小公倍数

本文将讲解如何求最大公约数和最小公倍数。
我将以3个部分进行讲解:
1.概念
2.原理
3.代码

一、概念

最大公约数的概念:如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
最大公约数(greatest common divisor,简写为gcd;或highest common factor,简写为hcf),指某几个整数共有因子中最大的一个。
能够整除一个整数的整数称为其的约数(如5是10约数);
能够被一个整数整除的整数称为其的倍数(如10是5的倍数);
如果一个数既是数A的约数,又是数B的约数,称为A,B的公约数,A,B的公约数
中最大的一个(可以包括AB自身)称为AB的最大公约数[1]
[最大公约数概念来自360百科:链接为https://baike.so.com/doc/5399827-5637381.html]
最小公倍数的概念:最小公倍数(Least Common Multiple,缩写L.C.M.),如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数,对于两个自然数来说,指该两数共有倍数中最小的一个。计算最小公倍数时,通常会借助最大公约数来辅助计算。
最小公倍数=两整数的乘积÷最大公约数。(只要先求出最大公约数,就可以很快的求出最小公倍数了。)
如果一个数既是a又是b的倍数,那么我们就把这个数叫着a和b的公倍数,如果这个数在a b的所有公倍数里为最小,那这个数就是最小公倍数。
[最小公倍数概念来自360百科:链接为https://baike.so.com/doc/5390805-5627461.html]

二、原理及代码

求最大公约数常见的方法有质因数分解法、短除法、辗转相除法、更相减损法。接下来将以辗转相除法和更相减损法来讲解如何求最大公约数。
2.1辗转相除法
辗转相除法的原理:假设用f(x, y)表示x,y的最大公约数,取k = x/y,b = x%y,则x = ky + b,如果一个数能够同时整除x和y,则必能同时整除b和y;而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x, y)= f(y, x%y)(y > 0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。
假设有两个整数a,b

  1. a%b=c;
  2. 若c=0,则b为两数的最大公约数
  3. 若c!=0,则a=b,b=c,再回去执行1.

    代码实现:

#include<iostream>
using namespace std;
int gcd(int a,int b){
    //辗转相除法求最大公约数 
    int temp;
    if(a<b){
        temp=a;
        a=b;
        b=temp;
    }
    if(a%b==0) return b;
    else return gcd(b,a%b);
}
int main(){
    int a,b;
    cin>>a>>b;
    cout<<"(a,b)的最大公约数为:"<<gcd(a,b);
    return 0;
}

2.2更相减损法
更相减损法的原理:第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

更相减损法:将两数以小减大累减以得之,如求24与15的等数,其逐步减损如下表所示:
(24,15)->(9,15)->(9,6)->(3,6)->(3,3),即3就是24与15的最大公约数。
代码实现:

#include<iostream>
using namespace std;

int main(){
    //用更相减损法求最大公约数
    int a,b;
    cin>>a>>b;
    while(a!=b) {
       if(a>b) a=a-b;
       else b=b-a;
    }
    cout<<"(a,b)最大公约数为:"<<a<<endl; 

   return 0;    
}

如果我说的对打开此页面的你有帮助,就为我点个赞吧~以资鼓励。

猜你喜欢

转载自blog.csdn.net/huyr_123/article/details/81670972