1. 程式人生 > >輾轉相除法求最大公約數

輾轉相除法求最大公約數

輾轉相除法, 又名歐幾里德演算法(Euclidean algorithm),是求最大公約數的一種方法。它的具體做法是:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除第一餘數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,那麼最後的除數就是這兩個數的最大公約數。 另一種求兩數的最大公約數的方法是更相減損法。

原理

兩個數的最大公約數是指能同時整除它們的最大正整數。 [1] 設兩數為a、b(a≥b),求a和b最大公約數 的步驟如下: (1)用a除以b(a≥b),得 。 (2)若 ,則 ; (3)若 ,則再用b除以 ,得 . (4)若 ,則 ;若 ,則繼續用 除以 ,…,如此下去,直到能整除為止。 其最後一個餘數為0的除數即為 的最大公約數。

證明

程式碼實現

#include <bits/stdc++.h>

using namespace std;

inline int read()
{
	int s = 0, w = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') 
	{
		if(ch == '-') w = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		s = (s << 1) + (s << 3) + ch - '0';
		ch = getchar();
	}
	return s * w;
}

int x, y;
int m, n;
int c, d;
int YS;

int work(int a, int b)
{
	m = max(a, b);
	n = min(a, b);
	c = m / n;
	d = m % n;
	if(d == 0)
	{
		return n;
	}
	else
	{
		work(b, d);
	}
}

int main()
{
	x = read();
	y = read();
	YS = work(x, y);
	cout << YS << endl;
	return 0;
}