輾轉相除法——分別使用【循環結構】和【遞歸函數】求——兩個整數的最大公約數和最小公倍數

程序參考《高質量程序設計指南——C++/C語言》

一、最大公約數(英語:Greatest Commom Divisor,gcd),指能夠整除多個整數的最大正整數

而多個整數不能都爲零,例如【8和12】的最大公約數爲4。

輾轉相除法(來自維基百科)

相比素因數分解法,輾轉相除法的效率更高。計算 gcd(18,48) 時:

  1. 先將48除以18得到2、餘數12
  2. 然後再將18除以12得到商1、餘數6
  3. 再將12除以6得到商2、餘數0,即得到最大公因數6。

我們只關心每次除法的餘數是否爲0,爲0即表示得到答案。這一算法更正式的描述是這樣的:

{\displaystyle \gcd(a,0)=a}

{\displaystyle \gcd(a,b)=\gcd(b,a\,\mathrm {mod} \,b)}

其中

{\displaystyle a\,\mathrm {mod} \,b=a-b\left\lfloor {a \over b}\right\rfloor }

如果參數都大於0,那麼該算法可以寫成更簡單的形式:

{\displaystyle \gcd(a,a)=a},

{\displaystyle \gcd(a,b)=\gcd(a-b,b)\quad } 如果 a > b

{\displaystyle \gcd(a,b)=\gcd(a,b-a)\quad } 如果 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章