最大公約數&最小公倍數
最大公約數
如果有一個自然數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