欧几里得算法和扩展欧几里得算法

欧几里得算法基本原理和证明

代码实现:

#include<iostream>
using namespace std;
int gcd(int a,int b){
	return b?gcd(b,a%b):a;
}
int main(){
	int x,y;
	cin>>x>>y;
	cout<<gcd(x,y)<<endl;
	return 0;
}

扩展欧几里得算法原理

代码实现:

#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1,y=0;
		return a;
	}
	int res=exgcd(b,a%b,y,x);
	y=y-(a/b)*x;
	return res;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,x,y;
		cin>>a>>b;
		exgcd(a,b,x,y);
		cout<<x<<" "<<y<<endl;
	}
	return 0;
}

扩展欧几里得算法的应用:

代码实现:

#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1,y=0;
		return a;
	}
	int t=exgcd(b,a%b,y,x);
	y-=a/b*x;
	return t;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int a,b,m,x,y;
		cin>>a>>b>>m;
		int res=exgcd(a,m,x,y);
		if(b%res)cout<<"impossible"<<endl;
		else cout<<x*(b/res)%m<<endl; //由于题目要求答案必须在int范围内,故需要进行取模操作
	}
	return 0;
}

 

posted @ 2023-04-30 01:18  回忆、少年  阅读(8)  评论(0编辑  收藏  举报