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百科:連結為
最小公倍數的概念:最小公倍數(Least Common Multiple,縮寫L.C.M.),如果有一個自然數a能被自然數b整除,則稱a為b的倍數,b為a的約數,對於兩個自然數來說,指該兩數共有倍數中最小的一個。計算最小公倍數時,通常會藉助最大公約數來輔助計算。
最小公倍數=兩整數的乘積÷最大公約數。(只要先求出最大公約數,就可以很快的求出最小公倍數了。)
如果一個數既是a又是b的倍數,那麼我們就把這個數叫著a和b的公倍數,如果這個數在a b的所有公倍數裡為最小,那這個數就是最小公倍數。
[最小公倍數概念來自360百科:連結為
二、原理及程式碼
求最大公約數常見的方法有質因數分解法、短除法、輾轉相除法、更相減損法。接下來將以輾轉相除法和更相減損法來講解如何求最大公約數。
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
- a%b=c;
- 若c=0,則b為兩數的最大公約數
若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;
}
如果我說的對開啟此頁面的你有幫助,就為我點個贊吧~以資鼓勵。