1. 程式人生 > 其它 >最大公約數&最小公倍數

最大公約數&最小公倍數

最大公約數

連結

如果有一個自然數a能被自然數b整除,則稱a為b的倍數,b為a的約數。幾個自然數公有的約數,叫做這幾個自然數的公約數。公約數中最大的一個公約數,稱為這幾個自然數的最大公約數

整除

若整數b除以非零整數a,商為整數,且餘數為零, 我們就說b能被a整除(或說a能整除b),b為被除數,a為除數,即a|b(“|”是整除符號),讀作“a整除b”或“b能被a整除”。a叫做b的約數(或因數),b叫做a的倍數

輾轉相除法

又叫【歐幾里德演算法】

用較大的數除以較小的數,上面較小的除數和得出的餘數構成新的一對數,繼續做上面的除法,直到出現能夠整除的兩個數,其中較小的數(即除數)就是最大公約數

程式碼

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /* 歐幾里德演算法:輾轉求餘 原理: gcd(a,b)=gcd(b,a mod b) 當b為0時,兩數的最大公約數即為a getchar()會接受前一個scanf的回車符 */ #include<stdio.h> unsigned int Gcd(unsigned int M,unsigned int N) { unsigned int Rem; while(N > 0) { Rem = M % N; M = N;
N = Rem; } return M; } int main(void) { int a,b; scanf("%d %d",&a,&b); printf("the greatest common factor of %d and %d is ",a,b); printf("%d\n",Gcd(a,b)); return 0; }

最簡程式碼

?
1 2 3 4 5 6 7 8 9 10 11 12 13 # 輾轉相除法<br>#include <stdio.h> #include <stdlib.h> int
main() { int a = 211, b = 1350; return gcd(b,a); } int gcd(int x,int y) { return y>0?gcd(y,x%y):x; }  

最小公倍數

連結

兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數。

計算方法

分解質因數法

先把這幾個數的質因數寫出來,最小公倍數等於它們所有的質因數的乘積(如果有幾個質因數相同,則比較兩數中哪個數有該質因數的個數較多,乘較多的次數)

例如: 45=3*3*5
    30=2*3*5
    不同的質因數是2。5,3是他們兩者都有的質因數,由於45有兩個3,30只有一個3,所以計算最小公倍數的時候乘兩個3.
    最小公倍數等於2*3*3*5=90

公式法

由於兩個數的乘積等於這兩個數的最大公約數與最小公倍數的積。即(a,b)×[a,b]=a×b。所以,求兩個數的最小公倍數,就可以先求出它們的最大公約數,然後用上述公式求出它們的最小公倍數。

例如:  求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。

求幾個自然數的最小公倍數,可以先求出其中兩個數的最小公倍數,再求這個最小公倍數與第三個數的最小公倍數,依次求下去,直到最後一個為止。最後所得的那個最小公倍數,就是所求的幾個數的最小公倍數。

程式碼

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include<stdio.h> int gcd(int a,int b); int lcm(int a,int b); int main(void) { int m,n,result_gcd,result_lcm; printf("求兩個數的最大公約數及最小公倍數?\n請輸入你想計算的兩個數:\n"); scanf("%d%d",&m,&n); result_gcd=gcd(m,n); result_lcm=lcm(m,n); printf("最大公約數為:%d\n最小公倍數為:%d\n",result_gcd,result_lcm); return 0; } int gcd(int a,int b) { int temp; if(a<b) { //交換兩個數,使大數放在a上 temp=a; a=b; b=temp; } while(b!=0) { //利用輾除法,直到b為0為止 temp=a%b; a=b; b=temp; } return a; } int lcm(int a,int b) { int temp_lcm; temp_lcm=a*b/gcd(a,b);//最小公倍數等於兩數之積除以其最大公約數 return temp_lcm; }

  

出處:https://www.cnblogs.com/pam-sh/p/12599576.html