1. 程式人生 > >最大公約數-最小公倍數 聯絡

最大公約數-最小公倍數 聯絡

利用 數a和數b 中有這樣的關係: 數a * 數b = 最大公約數 * 最小公倍數

第一步

兩個整數的最大公約數等於其中較小的數和兩數的相除餘數的最大公約數

第二步

利用最大公約數求最小公倍數

(1)輾轉相除法

int gcd(int a,int b){ 
	int temp; 
   	while(b!=0){ 
    	temp=a%b; 
    	a=b;
    	b=temp; 
    } 
    return a;
}

(2)更相減損法

第一步: 任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。 第二步: 以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。 繼續這個操作,直到所得的減數和差相等為止。

則第一步中(約掉的若干個2與第二步中等數)的乘積就是所求的最大公約數。

int gxjs(int a,int b){
	int sum=0;
	while(a%2==0&&b%2==0){	//(a&0x1)==0&&(b&0x1)==0
		a=a/2;		//a=a>>1;
		b=b/2;		//b=b>>1;
		sum++;
	}
	while(a!=b){
		int temp;
		if(a<b){
			temp=a;
			a=b;
			b=temp;	
		}
		a=a-b;
	}
	if(sum==0)
		return
b; else return pow(2,sum)*b; //return b<<sum; }

(3)Stein演算法

Stein演算法有點類似於更相減損法,它是針對歐幾里德演算法在對大整數進行運算時,需要試商導致增加運算時間的缺陷而提出的改進演算法。

思路:

如果Bn=0,An是最大公約數,演算法結束(若An=0,則Bn為負數,運算無意義)

如果An和Bn都是偶數,則An+1=An/2,Bn+1=Bn/2,Cn+1=Cn*2

如果An是偶數,Bn不是偶數,則An+1=An/2,Bn+1=Bn,Cn+1=Cn

如果Bn是偶數,An不是偶數,則Bn+1=Bn/2,An+1=An,Cn+1=Cn

如果An和Bn都不是偶數,則An+1=|An-Bn|/2,Bn+1=min(An,Bn),Cn+1=Cn

int Stein(int a,int b){
	int temp;
	if(a<b){
		temp=a;
		a=b;
		b=temp;	
	}
	if(b==0)
		return a;
	//下列除2運算可以運用右移一位操作 
	if(a%2==0&&b%2==0)
		return 2*gcd(a/2,b/2);
	else if(a%2==0&&b%2!=0)
		return gcd(a/2,b);
	else if(a%2!=0&&b%2==0)
		return gcd(a,b/2);
	else 
		return gcd((a-b)/2,b); 
}