輾轉相除法

吃貨智發表於2018-05-06

在求最大公約數的時候可以使用輾轉相除法

   大概思想 (比如 25 15)

        25   15     25%15=10

        15   10     15%10=5

        10    5       10%5=0

        5       0-------------》由此可得最大公約數為5


程式碼如下

int GCD(int a,int b)
{
   return b==0?a:GCD(b,a%b);
}

有時候用輾轉相除法的時候會卡時間。那麼,在這時候我們就需要用到二進位制演算法

  二進位制演算法思路(不斷去除因子2)

        若x==y 則GCD(x,y)=x否則:

        1、若x,y都是偶數,則GCD(x,y)=2*GCD(x/2,y/2);

        2、若x為偶數,y為奇數,則GCD(x,y)=GCD(x/2,y);

        3、若x為奇數,y為偶數,則GCD(x,y)=GCD(x,y/2);

        4、若x,y都是奇數,則GCD(x,y)=GCD(x-y,y);

    程式碼實現如下

#include<iostream>
using namespace std;

int GCD(int x,int y)
{
	int i,j;
	if(x == 0) return x;
	if(y == 0) return y;
	for(i = 0;0 == (x&1); ++i) x>>=1;		//去掉所有的2 
	for(i = 0;0 == (y&1); ++i) y>>=1;		//去掉所有的2 
	if(j < i) i = j;
	while(1)
	{
		if(x < y) x ^= y,y ^= x,x ^= y;   //若x<y  交換x y 
		if(0 == (x -= y)) return y<<i;
		//若x == y,gcd==x==y(就是在輾轉減,while(1)控制)
		while(0 == (x&1)) x >>= 1; //去掉所有的2 
	}
}

int main()
{
	int m,n;
	while(cin>>m>>n)
	{
		cout<<GCD(m,n)<<endl;
	}
}
讀者可以理解一下文字意思與程式碼含義

       

   

相關文章