最大公約數:能夠同時被兩個數整除的那個最大的數。
最小公倍數:兩個整數公有的倍數成為他們的公倍數,其中一個最小的公倍數是他們的最小公倍數。
最小公倍數=兩整數的乘積÷最大公約數 反之同理。
最大公約數算法:
1.GCD算法(歐幾里得算法):
定理:兩個整數的最大公約數等於其中較小的那個數和兩數的相除余數的最大公約數。最大公約數(greatest common divisor)縮寫為gcd。
gcd(a,b) = gcd(b,a mod b) (不妨設a>b 且r=a mod b ,r不為0)
1 int gcd(int a,int b) 2 { 3 int r; 4 while(b>0) 5 { 6 r=a%b; 7 a=b; 8 b=r; 9 } 10 return a; 11 }
以上是GCD算法的基礎模運算實現,即輾轉相除法。
位運算計算:
1 int gcd(int a,int b) 2 { 3 while(b^=a^=b^=a%=b); 4 return a; 5 }
遞歸方式實現:
1 int gcd(int a,int b) 2 { 3 return (b>0)?gcd(b,a%b):a; 4 }
2.相減法:
有兩整數a和b:
① 若a>b,則a=a-b
② 若a<b,則b=b-a
③ 若a=b,則a(或b)即為兩數的最大公約數
④ 若a≠b,則再回去執行①
例如求27和15的最大公約數過程為:
27-15=12( 15>12 ) 15-12=3( 12>3 )
12-3=9( 9>3 ) 9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即為最大公約數
1 /* a, b不相等,大數減小數,直到相等為止。*/ 2 while ( a!=b) 3 if (a>b) a=a-b; 4 else b=b-a;
3.窮舉法
窮舉法,即暴力算法,
有兩整數a和b:
① i=1
② 若a,b能同時被i整除,則t=i
③ i++
④ 若 i <= a(或b),則再回去執行②
⑤ 若 i > a(或b),則t即為最大公約數,結束
改進:
① i= a(或b)
② 若a,b能同時被i整除,則i即為最大公約數,
結束
③ i--,再回去執行②
有兩整數a和b:
① i=1
② 若a,b能同時被i整除,則t=i
③ i++
④ 若 i <= a(或b),則再回去執行②
⑤ 若 i > a(或b),則t即為最大公約數,結束
改進:
① i= a(或b)
② 若a,b能同時被i整除,則i即為最大公約數,
結束
③ i--,再回去執行②
1 /*窮舉法求最大公約數*/ 2 for (t= a; t>0; t-- ) 3 if ( a%t == 0 && b%t ==0 ) 4 break;
1 /*窮舉法求最小公倍數*/ 2 for (i= a; ; i++ ) 3 if ( i % a == 0 && i % b ==0 ) 4 break;