1. 程式人生 > >歐幾里得演算法 2018-10-18

歐幾里得演算法 2018-10-18

歐幾里得演算法就是輾轉相除。

歐幾里得演算法和輾轉相除法都是求兩數最小公倍數的演算法。
所以,歐幾里得演算法(輾轉相除法)的重要程式碼如下:

int gcd(int x,int y){
	if(y==0)
		return x;
	else
		return gcd(y,x%y);
}

歐幾里得演算法:可以求出兩個數的最大公因數
那麼,是否可以滿足不定方程ax+by=gcd(a,b)???
這就需要用到擴充套件的歐幾里得演算法,這個演算法就可以求出上面這個不定方程的一組特例解。
所以,歐幾里得演算法和擴充套件歐幾里得演算法的最大區別就是歐幾里得演算法只能求出兩數的最大公因數,而擴充套件歐幾里得演算法就可以順帶求出ax+by=gcd(a,b)的解:

 x = x0 + (b/gcd)*t
 y = y0 – (a/gcd)*t

所以,擴充套件歐幾里得的關鍵程式碼如下:

int e_gcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int ans=e_gcd(b,a%b,x,y);
	int temp=x;
	x=y;
	y=temp-a/b*y;
	return ans;
}

開始做題吧!!!http://lxg.yali.edu.cn/contest/12
T1:這就是一個裸擴充套件歐幾里得演算法
程式碼:

#include
<bits/stdc++.h>
using namespace std; int a,b,x,y,ans; int e_gcd(int a,int b){ if(b==0){ x=1; y=0; return a; } int ans=e_gcd(b,a%b); int temp=x; x=y; y=temp-a/b*y; return ans; } int main(){ cin>>a>>b; e_gcd(a,b); cout<<(x+b)%b; return 0; }

T2:直接a*b-a-b就可以A了2333擴充套件歐幾里得演算法沒有推出來······

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long a,b;
	cin>>a>>b;
	cout<<a*b-a-b;
}