1. 程式人生 > >c/c++語言求最大公約數、最小公倍數

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

如果我說的對開啟此頁面的你有幫助,就為我點個贊吧~以資鼓勵。