程序參考《高質量程序設計指南——C++/C語言》
一、最大公約數(英語:Greatest Commom Divisor,gcd),指能夠整除多個整數的最大正整數
而多個整數不能都爲零,例如【8和12】的最大公約數爲4。
輾轉相除法(來自維基百科)
相比素因數分解法,輾轉相除法的效率更高。計算 gcd(18,48) 時:
我們只關心每次除法的餘數是否爲0,爲0即表示得到答案。這一算法更正式的描述是這樣的:
其中
如果參數都大於0,那麼該算法可以寫成更簡單的形式:
,
如果 a > b
如果 b > a
二、最小公倍數(Least Commom Multiple)
兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數。
- 8=2*2*2 12 = 2*2*3
- 所以最小公倍數 = 2*2*2*3(把兩者分解的都乘進去)
- 8和12的最小公倍數就是 24
注:最小公倍數 = 【8*12】除以【8和12的最大公約數】 8*12/4 = 8*3 = 24
三、遞歸求解
#include<stdio.h>
//求兩個整數a和b的最大公約數
unsigned long gcd_2(unsigned long a,unsigned long b)
{
if(b==0){
return a;
}else{
return gcd_2(b,a%b);
}
}
int main(void){
unsigned long a,b; //兩個整數
unsigned long lcm=0; //最小公倍數
unsigned long gcd=0; //最大公約數
while(1){
printf("Please input two positive integers(spacebar as separator):");
scanf("%lu %lu",&a,&b);
if(a<=0 || b<=0){
printf("Input Error!\n");
continue;
}else{
break;
}
}
gcd = gcd_2(a,b);
lcm = (a*b)/gcd;
printf("Their Greatest Commom Divisor is %lu.\n",gcd);
printf("Their Least Commom Multiple is %lu.\n",lcm);
return 0;
}
四、循環結構求解
- 求最大公約數可用輾轉相除法
- 最小公倍數就是兩個整數的乘積除以其最大公約數
#include<stdio.h>
int main(void){
unsigned long a,b,c=0;
unsigned long lcm=0; //最小公倍數
unsigned long gcd=0; //最大公約數
while(1){
printf("Please input two positive integers(spacebar as separator):");
scanf("%lu %lu",&a,&b);
if(a<=0 || b<=0){
printf("Input Error!\n");
continue;
}else{
break;
}
}
unsigned long ra = a, rb = b; //保存原始數據
//輾轉相除法
while(a%b !=0){
c = a%b;
a = b;
b = c;
}
gcd = b;
lcm = (ra*rb)/gcd;
printf("Their Greatest Commom Divisor is %lu.\n",gcd);
printf("Their Least Commom Multiple is %lu.\n",lcm);
return 0;
}